我的测试用例中出现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());

10-06 09:26