我已经看到SO中已经存在类似的问题,我尝试了所有解决方案,但是由于我是tdd
我有一个这样的课程
public class AppUpdatesPresenter {
public void stopService() {
ServiceManager.on().stopService();
}
}
我有这样的测试班
@RunWith(MockitoJUnitRunner.class)
public class AppUpdatesPresenterTest {
@Mock
AppUpdatesPresenter appUpdatesPresenter;
@Mock
ServiceManager serviceManager;
@Mock
Context context;
@Test
public void test_Stop_Service() throws Exception {
appUpdatesPresenter.stopService();
verify(serviceManager,times(1)).stopService();
}
}
当我尝试进行测试时,如果我调用stopService()
方法,那么ServiceManager.on().stopService();
至少调用了一次。
但是我遇到了以下错误
Wanted but not invoked:
serviceManager.stopService();
-> at io.example.myapp.ui.app_updates.AppUpdatesPresenterTest.test_Stop_Service(AppUpdatesPresenterTest.java:103)
Actually, there were zero interactions with this mock.
不确定发生了什么问题。
答案 0 :(得分:0)
致电appUpdatesPresenter.stopService();
时,什么都没发生,因为您没有告诉应该怎么办。
要通过测试,您需要将appUpdatesPresenter
存根。
@Test
public void test_Stop_Service() throws Exception {
doAnswer { serviceManager.stopService(); }.when(appUpdatesPresenter).stopService()
appUpdatesPresenter.stopService();
verify(serviceManager).stopService();
}
顺便说一句,以上测试毫无意义,因为您对所有内容都进行了存根。
要使测试用例有意义,应注入 ServiceManager
,而不是将其与AppUpdatePresenter
耦合。
public class AppUpdatesPresenter {
private final ServiceManager serviceManager;
public AppUpdatesPresenter(ServiceManager serviceManager) {
this.serviceManager = serviceManager;
}
public void stopService() {
sm.stopService();
}
}
然后测试AppUpdatesPresenter
。
@InjectMock AppUpdatesPresenter appUpdatesPresenter;
现在,测试用例不再依赖于固定交互,而是依赖于代码的真实实现。
@Test
public void test_Stop_Service() throws Exception {
appUpdatesPresenter.stopService();
verify(serviceManager).stopService();
}