繁体   English   中英

如何使用单元测试测试无效?

[英]How to test void using Unit Test?

我有以下方法,并为此方法用 Java 编写了一个单元测试 除了if语句之外,它被覆盖,我还需要测试这部分。

@InjectMocks
private ProductServiceImpl productService;

public void demoMethod(final List<UUID> productUuidList) {
    if (productUuidList.isEmpty()) {
        return;
    }
    final Map<ProductRequest, PriceOverride> requestMap = getPriceRequests(uuidList);
    productService.updateByPriceList(priceRequestMap, companyUuid);
}

但是,由于方法执行已完成并且在uuidList为空时不返回任何内容,因此我无法测试此if块。

所以:

  1. if阻止,我该如何测试?

  2. 我应该创建一个新的单元测试方法来测试这个if块吗? 或者我应该将相关的断言行添加到当前的测试方法中吗?

更新:这是我的测试方法:

@Test
public void testDemoMethod() {
    final UUID uuid = UUID.randomUUID();
    final List<Price> priceList = new ArrayList<>();
    final Price price = new Price();
    
    price.setUuid(uuid);
    priceList.add(price);

    productService.demoMethod(Collections.singletonList(uuid));
}

一般的想法是你不想测试特定的代码,但你想测试一些行为

因此,在您的情况下,您希望验证在传入空List时不会调用getPriceRequestspriceService.updateByPriceList

具体如何执行取决于您可用的工具。 最简单的方法是,如果您已经模拟priceService :那么只需指示您的模拟库/框架验证从未调用updateByPriceList

在 if 条件中返回的要点是不执行其余代码。 即,如果要执行此// code omitted for brevity ,则该方法将无法满足其目的。 因此,只要确保无论该代码做什么,如果您的列表为空,它就没有完成。

你有3个选择:

  1. 使用模拟编写单元测试。 Mockito 允许您 verify() 是否调用了某个方法。
  2. 使用数据库编写更高级的测试。 在测试 Service Facade Layer 时,这通常是一个更明智的选择。 在这种情况下,您可以在测试中获取 DB 的结果状态,以检查它是否做了它必须做的。
  3. 重构您的代码以使其工作方式不同

查看测试金字塔贫血架构如何破坏您的测试以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM