Я пишу какой-то единичный тест, и я спотыкаюсь над этой странной «ошибкой», которая мешает мне запустить мой модульный тест.Mock with Mockito return invocationTargetException
Когда я запускаю «когда (...). ThenReturn (...)», я получаю InvocationTargetException. Тогда странно, что когда я отлаживаю, он переходит в реальный объект и падает на нулевой член. Когда я отлаживаю другие «когда», он переходит в функцию «Перехват», которая мешает идти в реальном коде ... Я не понимаю, что отличает этот объект и как предотвратить это странное поведение.
Вот мой блок тест:
@Test
public void getSyncStatusShouldReturnValueFromDiskWhenNotRunning() throws IOException {
//Arrange
when(updater.isDone()).thenReturn(true);
when(brandSyncUpdater.isDone()).thenReturn(true); //This is where it throw error
when(stationSyncUpdater.isDone()).thenReturn(true);
//Act
//Assert
}
Вот мой нАлАдкА() и член секции моего модульного тестирования класса
private Updater updater;
private BrandSyncUpdater brandSyncUpdater;
private StationSyncUpdater stationSyncUpdater;
@Before
public void setUp() {
updater = mock(Updater.class);
brandSyncUpdater = mock(BrandSyncUpdater.class);
stationSyncUpdater = mock(StationSyncUpdater.class);
}
Я не знаю, если это связано, но BrandSyncUpdater и StationSyncUpdater имеют родителя с именем SyncUpdater, где расположена функция isDone().
EDIT
Иерархия класса
Updater
класс по своей собственной
BrandSyncUpdater
и StationSyncUpdater
расширяют SyncUpdater
Updater isDone()
си gnature и код:
public boolean isDone() {
return states.isEmpty();
}
SyncUpdater isDone()
подпись и код:
public boolean isDone() {
return currentStates.isEmpty();
}
EDIT 2
Вот стека следы ошибки в консоли. Вы заметите, что здесь возникает ошибка «NullPointerException», потому что она пытается использовать переменную currentStates
. Но при отладке ошибка, вызванная mockito, - InvocationTargetException.
java.lang.NullPointerException
at com.stingray360.clap.synchronizer.contentcontroller.queue.SyncUpdater.isDone(SyncUpdater.java:117)
at com.stingray360.clap.synchronizer.contentcontroller.queue.BrandSyncUpdater.isDone(BrandSyncUpdater.java:15)
at com.stingray360.clap.synchronizer.contentcontroller.SyncDispatcherTest.getSyncStatusShouldReturnValueFromDiskWhenNotRunning(SyncDispatcherTest.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
Можете ли вы разместить классы «BrandSyncUpdater» и «Updater»? – Ruben
Я не могу, так как это код с моей работы, но если вы скажете мне то, что хотите узнать, я могу опубликовать некоторые части и/или добавить информацию к моему вопросу. Как я уже сказал, Updater работает нормально, это BrandSyncUpdater и StationSyncUpdater, которые бросают ошибку, когда насмехаются. –
Подпись методов и иерархии классов была бы полезной – Ruben