我正在尝试进行测试以检查某个列表是否包含项目,而我不关心顺序。
我希望能够做到这一点的方法是测试该项目是否具有具有特定值的特定属性。
我用以下代码隔离了 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;
}
}
测试类
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"))));
}
}
这个测试失败了。如果我在 countainsInAnyOrder 中切换列表的值,那么这有效。这不是我对“containsInAnyOrder”的期望。
正确的做法是什么?
或者有没有办法检查各个值是否存在?
最佳答案
我发现了问题所在。确实是 hamcrest 类的一个版本导致了这个问题。
采取的步骤:
- 更新了 maven-dependency-plugin
的版本- 原因:
- 无法运行命令 mvn dependency:tree。
- https://cwiki.apache.org/confluence/display/MAVEN/AetherClassNotFound
- 原因:
- 将我的 mockito 依赖项从 mockito-all 更改为 mockito-core
- 原因:
- mockito-all 依赖项直接包含 org.hamcrest.Matcher 类的一个版本。
- 当您查看加载的依赖项时,这并不是简单可见的(因为它在 mockito-all jar 本身中,而不是在 jar 的依赖项中。
- 原因:
- 在 dependencyManagement 中将 hamcrest-core 的版本设置为 1.3。
- 原因:
- mockito-core 依赖于 hamcrest-core 但使用版本 1.1
- hamcrest-core 的 mockito-core 版本优先于 hamcrest-core 的 junit 版本> 依赖。
- 原因:
所以基本上这是使用 mockito-all 引起的冲突。
关于java - hamcrest containsInAnyOrder 仅适用于特定订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24776185/