【问题标题】:Verify a method is called inside a method without calling other methods inside that method验证方法在方法内部被调用,而不在该方法内部调用其他方法
【发布时间】:2018-12-18 02:37:03
【问题描述】:
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() 行因为结果为空,并且测试用例失败。 请帮忙。

【问题讨论】:

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


    【解决方案1】:

    您的课程 ConnClient 是一个模拟,这就是为什么调用 connClient.query(arg1, arg2) 将返回 null 广告,因此在取消引用结果时会引发 NPE。

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

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

    someObject 允许作为模拟对象(或者,您可以返回具体值)。

    一旦完成,result 将不再为空,也不会抛出 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

    【讨论】:

    • 我试过这个。结果仍然为空。你能发布一个小例子吗?
    • doReturn(result).when(connClient).query(arg1,arg2);这个结果没有在 serviceClass.abc() 调用中起作用/注入,我得到了 NPE。
    • 请提供您的 TestClass 的标题。为了充分了解您如何初始化和运行您的测试。通常是某种@RunWith..
    【解决方案2】:

    您需要模拟对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);
    }
    

    【讨论】:

    • 谢谢。但是调用 serviceClass.abc() 使结果变量为空。
    • @Mock Result 结果; when(connClient.query(arg1, arg2)).thenReturn(result); when(result.getResults()).thenReturn("xyz"); serviceClass.abc() // 给出 NPE
    • Mockito.when 工作正常并模拟事物。但是当我调用 serviceClass.abc() 时,该行会生成 NPE,因为结果变为空。模拟的 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 个记录
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多