Java Hamcrest : 集合包含类型的项目

2022-09-02 03:06:03

我想断言 包含类型 .List<Achievement>TestAchievement

这是我的断言:

List<Achievement> achievements; // Populated elsewhere
assertThat(achievements,hasItem(isA(TestAchievement.class)));

这不会编译,报告错误:

Assert类型中的方法assertThat(T,Matcher)不适用于参数(List,Matcher<Iterable<TestAchievement>>)

使用Hamcrest的这种类型的断言的正确语法是什么?


答案 1

谢谢你的帮助。

这里的帖子表明这是Hamcrest的缺陷,所以我前往hacmrest网站注册一个错误,我发现我使用的mvn / ivy依赖声明已经过时了,给了我一个旧版本的Hamcrest。

此 bug 存在于 1.1 中,如果使用

<dependency org="org.hamcrest" name="hamcrest-all" rev="1.1">

但是,正确的 depedency 声明是:

<dependency org="org.hamcrest" name="hamcrest-library" rev="1.3.RC2"/>

更新到此版本解决了问题。我的测试中使用的语法是:

 assertThat(achievements, hasItem(isA(TestAchievement.class)));

答案 2

Java 6 中有一个与此相关的错误

此代码将引发各种错误,例如“找不到符号...”

assertThat(achievements, hasItem(isA(TestAchievement.class)));

解决此问题的方法是将匹配器声明为变量,然后引用该变量。重要的是要注意,变量的类型,特别是泛型部分,对于它的工作非常重要。

Matcher<Iterable<? super TestAchievement>> matcher = hasItem(isA(TestAchievement.class));
assertThat(achievements, matcher);

有趣的是,如果您使用而不是再次遇到问题。(尽管如果您忽略警告,这可能只适合您。扩展您可以使用的上一个修复程序:instanceOf()isA()

Matcher<TestAchievement> itemMatcher = Matchers.instanceOf(TestAchievement.class);
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(itemMatcher);
assertThat(achievements, matcher);

推荐