如何在 Java 8 中比较两个流

2022-09-01 00:10:19

比较Java 8中的两个实例并找出它们是否具有相同的元素(专门用于单元测试)的好方法是什么?Stream

我现在拥有的是:

@Test
void testSomething() {
  Stream<Integer> expected;
  Stream<Integer> thingUnderTest;
  // (...)
  Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray());
}

或者:

Assert.assertEquals(
    expected.collect(Collectors.toList()),
    thingUnderTest.collect(Collectors.toList()));

但这意味着我正在构建两个集合并丢弃它们。考虑到我的测试流的大小,这不是性能问题,但我想知道是否有一种规范的方法来比较两个流。


答案 1
static void assertStreamEquals(Stream<?> s1, Stream<?> s2) {
    Iterator<?> iter1 = s1.iterator(), iter2 = s2.iterator();
    while(iter1.hasNext() && iter2.hasNext())
        assertEquals(iter1.next(), iter2.next());
    assert !iter1.hasNext() && !iter2.hasNext();
}

答案 2

收集所测试的流(如您所显示的)是执行测试的一种简单而有效的方法。您可以以最简单的可用方式创建预期结果列表,这可能不是在收集流。

或者,对于大多数用于创建模拟协作者的库,可以模拟一个“期望”具有特定元素的一系列调用的库。与它一起使用,然后“验证”其配置的期望是否得到满足。Consumeraccept()Stream


推荐