StreamSupport 的 Junit 测试用例

Posted

技术标签:

【中文标题】StreamSupport 的 Junit 测试用例【英文标题】:Junit test cases for StreamSupport 【发布时间】:2020-03-20 09:02:43 【问题描述】:

我是测试用例的新手,我尝试了几种方法来为下面的代码编写测试用例,但我从未成功。如何使用 Powermockito 为以下代码编写 junit 测试用例?

StreamSupport.stream(irSet.spliterator(), false)
            .filter(iResultRow -> iResultRow !=null)
            .mapToInt(iResultRow ->
                String event = iResultRow.get("STF_TY_GH");
                return StringUtils.isNotBlank(event) ? Integer.parseInt(event) : 1;
            ).findFirst().orElse(1);

【问题讨论】:

重构您的代码以将流作为参数,然后在测试中传入您喜欢的任何流。 【参考方案1】:

虽然使用下降数量的模拟可以模拟每个调用,但我建议您使用另一种方法。

所以你有一个从一些输入集 (irSet) 变量产生的流。此流进行“一些”处理并返回整数结果。

所以如果你“想象”它是一个黑盒子:一种看起来像这样的函数:

int doSomething(Set<SomeRow> irSet) 
  ... your implementation is here...

在这种情况下,您可能希望通过提供各种输入集并期望一些输出来测试它的作用。如果输入中有null-s 怎么办?它会失败还是过滤掉需要的东西。如果集合为空怎么办?如果有SomeRow确实有STF_TY_GH数据,如果集合没有这样的行怎么办?

下面是一个测试示例:

  @Test
  public void test_rows_with_null_are_processed_correctly() 

      // setup:
      Set<SomeRow> input = ...// prepare a set with null values

      // when:
      Integer actual = underTest.doSomething(input)

      // then:
      // verify this "actual" whether it should be 1 or something else 
    

总而言之,仅将模拟用于交互(与您无法真正实例化的东西,如 DB API/远程 HTTP 调用)或与测试代码无关并用作测试的依赖项的东西代码与之交互。毕竟,单元测试的目标是测试您的代码(在这种情况下是doSomething 的实现,而不是模拟所有内容)。

【讨论】:

以上是关于StreamSupport 的 Junit 测试用例的主要内容,如果未能解决你的问题,请参考以下文章

junit覆盖率问题

如何使 JUnit 测试用例按顺序运行?

junit测试用例

JUnit 测试用例中“失败”的实际用途是啥?

junit4.9测试用例 spring测试用例 Assert 注解

Java Runnable 运行的 JUnit 测试用例