Сегодня я узнал о Mockito и, играя с ним, обнаружил кое-что, чего не понимаю.
Скажем, я хотел бы протестировать следующий фрагмент кода:
public void stop(boolean showMessage) {
if(executor != null && !executor.isShutdown() && this.isRunning) {
if(showMessage) {
View.getSingleton().showMessageDialog(Constant.messages.getString("sessionchecker.stopmessage"));
}
executor.shutdownNow();
executor = null;
extension.getCountdownTimer().stopCountdown();
this.isRunning = false;
this.usersReady.clear();
}
}
Поскольку метод остановки является пустым, мне нужно будет вызвать doAnswer
(если я правильно понимаю). Итак, я попробовал следующее:
@Test
public void testStopIsRunningFalse() {
Mockito.when(controller.isRunning()).thenReturn(true); // Mock a running service
Mockito.doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
if(controller.isRunning()) {
// Normally would actually shut down service
Mockito.when(controller.isRunning()).thenReturn(false); // Service should stop
}
return null;
}
}).when(controller).stop(false);
controller.stop(false);
boolean expected = false;
assertEquals(expected, controller.isRunning());
}
Я, однако, не понимаю, какова цель такого теста. Зачем мне тестировать это так, если это никогда не подведет (параметр isRunning
устанавливается так, как я и ожидал). В основном мне нужно только проверить состояние определенных полей (например, isRunning
и executor
). Однако эти поля не имеют общедоступных геттеров или сеттеров.
Поэтому я думаю, что неправильно понимаю использование deAnswer
. Может ли кто-нибудь помочь мне?
@InjectMocks
Mockito в своем поле для тестируемого класса, а затем объявить и аннотировать с помощью@Mock
поле Executor в своем тестовом классе. Это позволит вводить в тестируемый класс даже приватные поля, используя магию Mockito. Это делается либо путем применения Mockito JUnit runner к вашему тесту, либо путем вызова статического методаMockito.initMocks()
в методе JUnit@Before
(настройка). 03.10.2017