我正在写一些单元测试,我偶然发现这个奇怪的“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();
}
答案 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