验证方法在方法内部被调用而没有在该方法内部调用其他方法

时间:2018-07-10 09:44:38

标签: spring spring-boot junit mockito spring-test

public class ServiceClass {
    @Autowired
    ConnClient connClient;
    public void abc() {
         result = connClient.query(arg1, arg2); // verify called once.
         allDocsReturned = result.getResults(); // throws NPE
    }
}

我需要验证 connClient.query(arg1,arg2)至少被调用一次。因此,在测试用例文件中,我正在调用方法 abc()

@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Test
public void testABC() {
  serviceClass.abc();
  verify(connClient, times(1)).query(arg1,arg2);
}

我收到NullPointerException,因为上面调用了 result.getResults()行,因为结果为null,并且测试用例失败。 请帮忙。

2 个答案:

答案 0 :(得分:0)

您需要模拟对connClient.queryResultSet的调用:

@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Test
public void testABC() {
  ResultSet rs = mock(ResultSet.class);
  when(rs.getResults()).thenReturn(//here return the object of type of your variable allDocsReturned);
  when(connClient.query(arg1,arg2)).thenReturn(rs);
  serviceClass.abc();
  verify(connClient, times(1)).query(arg1,arg2);
}

答案 1 :(得分:0)

您的类ConnClient是一个模拟,这就是为什么调用connClient.query(arg1, arg2)将返回null ad从而在取消引用结果时引发NPE的原因。

在这种情况下,您可以指定方法调用的返回值,即

doReturn(someObject).when(connClient).query(arg1,arg2);

其中someObject可以作为模拟对象(或者,您可以返回一个具体值)。

完成此操作后,result将不再为null,也不会抛出NPE。

请注意,如果以后取消引用result,则还必须模拟getResults()调用。

编辑:

@InjectMocks
ServiceClass serviceClass;
@Mock
ConnClient connClient;
@Mock
Result result;
@Test
public void testABC() {
    doReturn(result).when(connClient).query(arg1,arg2);       
    serviceClass.abc();
    verify(connClient, times(1)).query(arg1,arg2);
}

现在结果将不会为空,但是,allDocsReturned仍将为空,但不会导致NPE带有您发布的代码