我的测试用例中出现InvocationTarget Exception。这是我要测试的课程:
public class UpdateHandler implements Handler {
public void process(UE m, UEC u) {
try {
Info info = facade1.queryInfo(string).getInfo();
Index index = facade2.findindex(string2);
if(facade3.isWhitelisted() {
facade2.update(info, index);
}
} catch(UpdateException e) {
//log
}
}
这是我的测试文件
public class TestFile {
@Mock
protected Facade1 facade1;
@Mock
protected Facade2 facade2;
@Mock
protected Facade3 facade3;
private Info info;
private Index index;
@InjectMocks
private UpdateHandler updatehandler;
@BeforeMethod
public void beforeTest() {
MockitoAnnotations.initMocks(this);
}
@Test
public void Test1() {
info = getInfo();
index = getIndex();
updateHandler.process(UEprepare(), null);
Mockito.when(facade1.queryInfo(Mockito.anyString()).getInfo()).thenReturn(getInfo());
Mockito.when(facade2.findindex(Mockito.anyString()).thenReturn(getIndex());
Mockito.when(facade3.isWhitelisted()).thenReturn(true);
Mockito.verify(facade1, Mockito.times(1).update(info, index);
}
}
getInfo()和getIndex()是我在测试文件中创建的两个方法,用于创建Info和Index的示例对象。 UEprepare是一种准备UE样本对象的方法。 UM可以为null。我已经检查了这不是问题。
我得到的错误是空指针异常。具体来说,facade1.queryInfo(string)的值为null。它应该是InfoResult类型的对象,可以从中提取Info的对象。我检查了queryInfo方法,该方法不会在任何地方抛出NPE。它仅引发UpdateException类型的异常,我已经在尝试捕获中的代码中对其进行了处理。
当我深入研究时,我发现了InvocationTargetException。我无法具体了解该异常的来源,但我认为它与queryInfo方法有关。
我已经为所有正在使用的外墙初始化了模拟程序,并且我想我也正确使用了InjectMocks,因此我坚持如何调试它。
最佳答案
您的代码中有2个错误:
方法顺序
你有:
被测方法的调用
设定期望值Mockito.when
期望验证Mockito.verify
虽然应该
设定期望值Mockito.when
被测方法的调用
期望验证Mockito.verify
连锁期望
Mockito.when(facade1.queryInfo(Mockito.anyString()).getInfo()).thenReturn(getInfo());
对于
queryInfo
调用的结果,您需要附加的模拟,比方说@Mock QueryInfo queryInfo
。然后,您需要致电2次以设置此期望值:Mockito.when(facade1.queryInfo(Mockito.anyString()).thenReturn(queryInfo);
Mockito.when(queryInfo.getInfo()).thenReturn(getInfo());