hamcrest containsInAnyOrder仅适用于特定订单

ste*_*try 6 java collections junit hamcrest

我正在尝试进行测试,检查某个列表是否有项目,而我不关心订单.
我希望能够做到这一点的方法是通过测试项具有某个具有特定值的属性.

我用以下代码隔离了senario:

我正在使用的类别:

public class A {
    private String propA;

    public A (final String propA) {
        this.propA = propA;
    }

    public String getPropA() {
        return propA;
    }

    public void setPropA(final String propA) {
        this.propA = propA;
    }
}
Run Code Online (Sandbox Code Playgroud)

识别TestClass

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class HamcrestCollectionTest {
    @Test
    public void testContainsInAnyOrder() {
        List<A> list = new ArrayList<A>();

        list.add(new A("a"));
        list.add(new A("b"));

        assertThat(list, containsInAnyOrder(hasProperty("propA", equalTo("b")), hasProperty("propA", equalTo("a"))));
    }
}
Run Code Online (Sandbox Code Playgroud)

此测试失败.如果我在countainsInAnyOrder中切换列表的值,那么这是有效的.这并不是我对"containsInAnyOrder"的期望.

这样做的正确方法是什么?
或者有没有办法检查个别值是否存在?

ste*_*try 5

我发现了问题所在.它确实是一个引起问题的hamcrest类的版本.

采取的步骤:

  1. 更新了maven-dependency-plugin的版本
  2. 将我的mockito依赖从mockito-all改为mockito-core
    • 原因:
      • 的Mockito,所有依赖含有的类版本org.hamcrest.Matcher直接.
      • 当您查看加载的依赖项时,这不是简单可见的(因为它位于mockito-all jar本身而不是jar的依赖项中).
  3. dependencyManagement中将hamcrest-core的版本设置为1.3.
    • 原因:
      • mockito-core依赖于hamcrest-core,但使用的是1.1版本
      • hamcrest-coremockito-core版本优先于hamcrest-core依赖的junit版本.

所以基本上是使用mockito-all引起的冲突.