与Mockito模拟返回一个InvocationTargetException

时间:2015-10-19 14:32:28

标签: unit-testing junit mocking mockito junit4

我正在写一些单元测试,我偶然发现这个奇怪的“bug”,这阻止了我运行单元测试。

当我运行“when(...)。thenReturn(...)”时,我收到一个InvocationTargetException。然后奇怪的是,当我调试时,它会进入真实对象并在null成员上崩溃。当我调试其他“when”时,它进入一个名为“Intercept”的函数,它阻止进入真正的代码...我不明白这个对象有什么不同以及如何防止这种奇怪的行为。

这是我的单元测试:

readyState==2

这是我的单元类测试的setUp()和成员部分

readyState==4

我不知道它是否相关,但BrandSyncUpdater和StationSyncUpdater都有一个名为SyncUpdater的父级,isDone()函数位于其中。

修改

类的层次结构

@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); } Updater正在扩展BrandSyncUpdater

StationSyncUpdater签名和代码:

SyncUpdater

Updater isDone()签名和代码:

public boolean isDone() {
    return states.isEmpty();
}

编辑2

以下是控制台中错误的堆栈跟踪。您会注意到此处的错误是“NullPointerException”,因为它尝试使用变量SyncUpdater isDone()。但是在调试时,mockito抛出的错误是InvocationTargetException。

public boolean isDone() {
    return currentStates.isEmpty();
}

4 个答案:

答案 0 :(得分:1)

我只是因为错误尝试了其他问题而找到了问题。

我的SyncUpdater课程不公开(这是包)。所以当试图使用Reflection时,它会卡住并抛出这个奇怪的错误。

感谢评论中人们的帮助!

答案 1 :(得分:0)

我也遇到了这个错误。在我的情况下,我错过了我的班级的 @RunWith(PowerMockRunner.class)(我知道这是一个愚蠢的错误,但浪费了几个小时来排除其他一切:))。

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

}

答案 2 :(得分:0)

我也遇到了这种异常,原因是我没有初始化我模拟的方法所属的类。

答案 3 :(得分:0)

我在下面的代码中遇到了相同的问题

catch (final HttpStatusCodeException e)

在HttpStatusCodeException之前删除 final 之后,Junit测试正常。

我只使用Mockito,没有PowerMock