【问题标题】:Hamcrest Matchers.containsInAnyOrder does not workHamcrest Matchers.containsInAnyOrder 不起作用
【发布时间】:2021-06-23 22:40:48
【问题描述】:

我正在使用这个依赖项:

   <dependencies>
        <!-- Testing -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-all</artifactId>
                <version>1.3</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <exclusions>
                    <exclusion>
                        <artifactId>hamcrest-core</artifactId>
                        <groupId>org.hamcrest</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>1.9.5</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.hamcrest</groupId>
                        <artifactId>hamcrest-core</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

但是,使用如下函数:

List<String> output = ..;
List<String> data = ...;
Assert.assertThat(output, Matchers.containsInAnyOrder(data));

导致错误。什么是修复 hamcrest 以使该功能真正起作用的正确方法?我试图找出正确的依赖管理,找到了上面提到的配置。

我收到的错误是断言错误,如果我比较两个相同的列表但具有混洗值,它不会通过但失败

例子:

List<String> output = Arrays.asList(
                "text1\t1",
                "text2\t1",
                "text3\t1",
                "text4\t1",
                "text5\t1",
                "text6\t1",
                "text7\t1",
                "text8\t1",
                "text9\t1",
                "text10\t1"
        );

        List<String> output1 = Arrays.asList(
                "text2\t1",
                "text3\t1",
                "text4\t1",
                "text5\t1",
                "text6\t1",
                "text7\t1",
                "text8\t1",
                "text9\t1",
                "text10\t1",
                "text1\t1"
        );


        Assert.assertThat(output, Matchers.containsInAnyOrder(output1));

【问题讨论】:

  • 请分享您得到的确切错误 - 编译或运行时错误。添加您遇到的错误的堆栈跟踪也很有用
  • @Daniel 添加了评论!
  • 请提供所有输入和输出的可重现示例 - 因为这将有助于确定根本原因
  • assertThat(output).hasSameElementsAs(output1) 如果我正确理解问题,这就是您要寻找的内容。

标签: java mockito hamcrest


【解决方案1】:

问题是 Matchers.containsInAnyOrder doesn’t have a variant 接受要匹配的项目集合 - 它接受匹配器集合或项目可变参数。在您的情况下,您最终调用了 vararg 变体,因此您实际上断言的是 output 是一个列表列表,其中单个元素等于 data

有几种方法可以使断言按预期工作:例如,您可以将数据转换为满足可变参数的数组,或者您可以将 data 映射到 equalTo 匹配器的集合,例如

Assert.assertThat(output, Matchers.containsInAnyOrder(data.stream().map(Matchers::equalTo).collect(Collectors.toList())));

【讨论】:

  • 虽然第一部分的解释是正确的 - 示例不遵循这些规则。下一个代码应该做有效的断言:assertThat(output, Matchers.containsInAnyOrder(output1.toArray()));
  • 假设您将data 替换为output1,我给出的示例适用于问题中的数据(现在我已经修复了丢失的括号)。你遇到了什么错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多