【问题标题】:Java Stream missing a code coverage branchJava Stream 缺少代码覆盖分支
【发布时间】:2020-02-11 17:26:17
【问题描述】:

对于以下内容,Jacoco 说所有 4 个分支都已涵盖。

list.stream()
  .forEach(item -> item.type.equals("Good") && item.expired == false);

但是对于这个 sn-p,并运行同一组测试,Jacoco 说缺少 1 个分支。

list.stream()
  .filter(item -> item.type.equals("Good") && item.expired == false)
  .findFirst()
  .get()

这怎么可能?

psuedocode:
public void testA() {
  // new Item(item type, is expired)
  item1 = new Item("Good", false);
  item1 = new Item("Good", true);
  item1 = new Item("Electricity", false);
  item1 = new item("Water", true);

  Item result = service.methodToTest(item1, item2, item3, item4);

  assertThat(result).isEqualTo(item1);
}

【问题讨论】:

  • 你能把你为它写的测试包括进去吗?

标签: java java-8 java-stream code-coverage jacoco


【解决方案1】:

这是因为这个 sn-p 中的 forEach 被每个元素调用(尽管它没有做任何事情 - 它产生一个 boolean 并忘记它):

list.stream()
  .forEach(item -> item.type.equals("Good") && item.expired == false);

而在下面的 sn-p 中,您通过谓词过滤元素:

list.stream()
  .filter(item -> item.type.equals("Good") && item.expired == false)
  .findFirst()
  .get()

您需要检查不满足谓词的元素是否被过滤掉,反之亦然。这样你就有 2 个分支要检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2012-01-11
    • 2015-10-31
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多