我正在迁移到robot electric 3.0
问题陈述——
我有一个类appltility,它在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();
}
但是我得到以下错误消息:——哪个show mock没有链接到活动,我怎么能把它绑定到活动?
Actually, there were zero interactions with this mock.
但是模拟对象不与测试相关联。在早期版本的robolelectric中,我将模拟对象与活动创建相关联,方法是重写它,如下所示
myActivity = new MyActivity() {
@Override
AppUtility getUtil() {
return mockAppUtility;
}
};
myActivity.onCreate(new Bundle());
和它使用工作良好,与Robolectric 3.0,我如何在开始活动之前绑定模拟对象。
@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
在第一步——activityController.setup();
使用mockito模拟注入功能设置mock很容易。
@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,…)之前设置mock,您必须在设置之前访问您的活动。
@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()
}
单元测试的主要规则之一——永远不要在测试下模拟类。你可以在上面加spy
,但这是救援挑战,在这种情况下你不应该使用
另一个smell
显示您有唤醒测试-当您能够成功运行此测试时,它将不能保证真正的警报设置。它将只保证调用了此方法。因此,最好验证set alrams而不是验证方法调用。查看此链接查看影子警报管理器