2015-10-19 4 views
2

Я пишу какой-то единичный тест, и я спотыкаюсь над этой странной «ошибкой», которая мешает мне запустить мой модульный тест.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) 
+0

Можете ли вы разместить классы «BrandSyncUpdater» и «Updater»? – Ruben

+0

Я не могу, так как это код с моей работы, но если вы скажете мне то, что хотите узнать, я могу опубликовать некоторые части и/или добавить информацию к моему вопросу. Как я уже сказал, Updater работает нормально, это BrandSyncUpdater и StationSyncUpdater, которые бросают ошибку, когда насмехаются. –

+0

Подпись методов и иерархии классов была бы полезной – Ruben

ответ

1

Я только что нашел ошибку по ошибке, попробовав что-то еще.

My SyncUpdater класс не был публичным (это был пакет). Поэтому, пытаясь использовать Reflection, он застрял и выбросил эту странную ошибку.

Спасибо за помощь людей в комментариях!

+0

Как вы ее решили тогда :) – Andy897

+0

Как я уже сказал, мой класс не был публичным, это был доступ к пакету. Как только я вернул «общественность», он начал работать. –

0

У меня также есть эта ошибка. В моем случае я пропустил @RunWith (PowerMockRunner.class) для моего класса (я знаю, что это глупая ошибка, но потраченные впустую несколько часов устраняют все остальное :)).

@RunWith(PowerMockRunner.class) 
public class SimpleServiceUpgradeManagerTestNotUsed { 
//Class content 

}