【问题标题】:Is testing with any() enough or we should alway check if a method was called with a right object? [closed]使用 any() 进行测试是否足够,或者我们应该始终检查是否使用正确的对象调用了方法? [关闭]
【发布时间】:2021-08-26 11:28:20
【问题描述】:

我是测试新手,无法理解。 这是一个代码示例,非常简单的保存测试,但是使用any() 方法进行测试是否足够?我们为什么不使用refEq() 对其进行测试,以确保使用正确的对象调用 save 或它是多余的并影响优化?

@Test
void givenProductToAddShouldReturnAddedProduct() throws ProductAlreadyExistsException {
     //stubbing
     when(productRepository.save(any())).thenReturn(product1);
     productService.addProduct(product1);
     verify(productRepository,times(1)).save(any());
}

是否也可以这样测试Controller(不检查是否使用@RequestBody中的对象调用了服务方法,只验证它被调用过一次)?

【问题讨论】:

    标签: java spring testing mockito


    【解决方案1】:

    在我看来,这一切都取决于您想要测试代码的细节或您正在测试的代码。 如果您想测试每一个细节或者您正在测试核心功能,那么any() 可能还不够,您可能会考虑使用参数捕获器 (https://www.baeldung.com/mockito-argumentcaptor) 来真正检查所有内容。如果您可以接受不太详细的测试,或者您正在测试非核心功能,那么any() 可以(我至少建议您使用any(Class<T> type),因为它会检查对象是否属于给定类型并保证它不为空)。

    【讨论】:

      【解决方案2】:

      假设您正在测试的代码如下所示:

      ...
      void addProduct(Product product) {
       double p1 = product.getThing() * 2;
       String p2 = product.getOtherThing().toUpperCase();
       ...
       DBProduct dbProd = new DBProduct(p1, p2, ...);
       productRepository.save(dbProd);
      }
      ...
      

      然后您确实要检查传递给保存的值。 如果产品被直接传递保存,您可能不会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-12
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多