Spring 验证是否在方法内调用了方法,而不在该方法内调用其他方法

Spring 验证是否在方法内调用了方法,而不在该方法内调用其他方法,spring,spring-boot,junit,mockito,spring-test,Spring,Spring Boot,Junit,Mockito,Spring Test,我需要验证是否至少调用了一次connClient.query(arg1,arg2)。因此,在测试用例文件中,我调用方法abc() public class ServiceClass { @Autowired ConnClient connClient; public void abc() { result = connClient.query(arg1, arg2); // verify called once. allDocsRetu

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

public class ServiceClass {
    @Autowired
    ConnClient connClient;
    public void abc() {
         result = connClient.query(arg1, arg2); // verify called once.
         allDocsReturned = result.getResults(); // throws NPE
    }
}
我得到了NullPointerException,因为上面作为result调用的行result.getResults()为null,并且测试用例失败。
请提供帮助。

您需要模拟调用
connClient.query
ResultSet

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

您的类
ConnClient
是一个mock,这就是调用
ConnClient.query(arg1,arg2)
将返回空ad的原因,因此在取消引用结果时会抛出NPE

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

@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);
}
其中,
someObject
被允许是一个模拟对象(或者,您可以返回一个具体的值)

完成此操作后,
result
将不再为空,并且不会抛出任何NPE

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

编辑:


现在结果将不会为空,但是,AllDocsReturn仍将为空,但不会导致NPE显示您发布的代码

我尝试了这个。结果仍然为空。你能举个小例子吗?doReturn(result).when(connClient.query)(arg1,arg2);此结果未在serviceClass.abc()调用中执行/注入,我正在获取NPE。请提供TestClass的标头。为了充分了解您是如何初始化和运行测试的。通常是某种
@RunWith
。谢谢。但是调用serviceClass.abc()会使结果变量为null。@Mock result;当(connClient.query(arg1,arg2)),然后返回(结果);当(result.getResults())。然后返回(“xyz”);serviceClass.abc()//给出NPEMockito.when,它可以正常工作并模拟事物。但当我调用serviceClass.abc()时,该行生成的NPE结果变为null。mock when(connClient.query(arg1,arg2)).thenReturn(result)未在serviceClass.abc()调用中执行/注入。您可以尝试when(connClient.query(arg1,arg2)).thenReturn(any(ResultSet.class));org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!需要0个匹配器,记录了1个
doReturn(someObject).when(connClient).query(arg1,arg2);
@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);
}