模版单元测试希望但未调用:

时间:2018-09-11 04:59:20

标签: junit mockito tdd

我已经看到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.

不确定发生了什么问题。

1 个答案:

答案 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();
}