Я думаю, что проблема многопоточная.
Когда вы звоните initConnection
, он вызывает mConnection.connect()
в Thread
Проблема, с которой вы сталкиваетесь, заключается в том, что для завершения этого Thread
требуется некоторое время, и в итоге вы звоните verify(mockedZConnection, times(1)).connect();
до того, как поток действительно достигнет вызова connect()
.
Чтобы убедиться в этом, нужно присоединиться к Thread
после его запуска, дождаться окончания действия Thread
и продолжить:
mThread.start();
try {
mThread.join();
} catch (InterruptedException i) {
i.printStackTrace();
}
Теперь оба теста должны работать.
Это, конечно, неприемлемо в коде, потому что оно отрицает использование Thread
. Вам понадобится другой способ проверить это.
Я могу придумать способ дождаться завершения Thread в вашем тесте, прежде чем проверять макет:
@Test
public void test_onStart_throw_IO_exceptioon() throws Exception {
ZConnectionService zConnectionService = new ZConnectionService();
ZConnection mockedZConnection = mock(ZConnection.class);
doNothing().when(mockedZConnection).connect();
zConnectionService.initConnection(mockedZConnection);
// Wait for the Thread to complete
while(zConnectionService.mThread.isAlive()) {
Thread.sleep(100);
}
verify(mockedZConnection, times(1)).connect();
}
Попробовал и у меня работает нормально. Не уверен, что это лучшая практика, так как вам нужно обнародовать некоторые внутренности вашего класса, что нарушает инкапсуляцию
возможно, использование защищенного пакета isThreadAlive()
в вашем классе ZConnectionService
может быть приемлемым
boolean isThreadAlive() {
return mThread.isAlive();
}
и петля в тесте
while(zConnectionService.isThreadAlive()) {
Thread.sleep(100);
}