mocking - robolectric 3.0 Mockito -- 如何在事件中模拟类

标签 mocking robolectric android-testing

我正在迁移到 robolectric 3.0

问题陈述--

我有一个 AppUtility 类,它在 MyActivity 中实例化,因此要检查它的方法是否被调用,我需要在设置 MyActivity 之前在测试中模拟它。

这是我的代码:

@Mock
private AppUtility mockAppUtility;

@Before
public void setUp() {
    initMocks(this);
    myActivity= Robolectric.setupActivity(MyActivity.class);
    equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
    shadowActivity = Shadows.shadowOf(myActivity);
}

测试方法如下:--

  @Test
        public void shouldCallStartAlarm() {
            for (int i = 0; i < 4; i++) {
                equalsButton.performClick();
            }
            verify(mockAppUtility).startAlarm();
        }

但是我收到以下错误消息:--显示模拟未链接到事件,如何将其绑定(bind)到事件?

Actually, there were zero interactions with this mock.

但是模拟对象与测试没有关联。在 Robolectric 的早期版本中,我使用以下方式将模拟对象与事件创建相关联,方法是覆盖它

 myActivity = new MyActivity() {
                @Override
                AppUtility getUtil() {
                    return mockAppUtility;
                }
            };
            myActivity.onCreate(new Bundle());

它使用 Robolectric 3.0 工作得很好,我如何在启动事件之前绑定(bind)模拟对象。

按照@nenick你的第二个选择:这就是它的样子

    @Mock
    private AppUtility appUtility;
    @InjectMocks
    private MyActivity myActivity;
    @Before
    public void setUp() {
        ActivityController<MyActivity> activityController = Robolectric.buildActivity(MyActivity.class);
//      myActivity= Robolectric.setupActivity(MyActivity.class);
        myActivity=activityController.get();
        initMocks(this);
        activityController.setup();
        equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
//      shadowActivity = Shadows.shadowOf(calculatorActivity);
    }

但是我遇到了异常:-

java.lang.IllegalArgumentException: attempted to invoke public final android.app.Application org.robolectric.shadows.ShadowActivity.getApplication() on instance of class org.com.android.AppUtility$$EnhancerByMockitoWithCGLIB$$77c74666, but AppUtility$$EnhancerByMockitoWithCGLIB$$77c74666 doesn't extend ShadowActivity

it breaks at step--activityController.setup();

最佳答案

使用mockito模拟注入(inject)功能,只需设置模拟即可轻松完成。

@Mock
private AppUtility mockAppUtility;

@InjectMocks
Activity mActivity;

@Before
public void setUp() {
  myActivity= Robolectric.setupActivity(MyActivity.class);
  equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
  shadowActivity = Shadows.shadowOf(myActivity);

  // create and injects mocks into object annotated with @InjectMocks
  initMocks(this);
}

要在调用事件设置(onCreate,...)之前设置模拟,您必须在设置之前访问您的事件。

@Before
public void setUp() {
  ActivityController<Activity> activityController = Robolectric.buildActivity(Activity.class);

  // get the activity instance 
  mActivity = activityController.get()

  initMocks(this);

  // now setup your activity after mock injection
  activityController.setup()
}

关于mocking - robolectric 3.0 Mockito -- 如何在事件中模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707894/

相关文章:

reactjs - 使用 URL 对象进行 Jest 测试

mocking - 尽管 POST 请求中缺少字段,SwaggerHub 模拟响应仍返回 201

android - Robolectric 和 Android SDK 29

android - RoboGuice 2.0 和 Robolectric 1.1 测试 RoboAsyncTask

android - 如何在 Android 中使用多个自定义测试运行程序?

android - 如何通过 uiautomator 设置密码字段的文本

javascript - 如何使用 Jest 模拟同一模块中的函数?

Angular Mock ActivatedRoute 使用 Snapshot 和 ParamMap

android - java.lang.IllegalStateException : Cancel call cannot happen without a maybeRun

android - onChildView 和 hasSiblings 与 Espresso