我正在迁移到 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/