Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hamcrest:集合包含类型为的项_Java_Unit Testing_Hamcrest - Fatal编程技术网

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

Java Hamcrest:集合包含类型为的项,java,unit-testing,hamcrest,Java,Unit Testing,Hamcrest,我想断言,List包含类型为testachieve的成员 以下是我的主张: List<Achievement> achievements; // Populated elsewhere assertThat(achievements,hasItem(isA(TestAchievement.class))); 列出成就;//在别处居住 资产(成就,hasItem(isA(TestAchievement.class)); 这不会编译,并报告错误: 方法断言(T,Matcher) 在类

我想断言,
List
包含类型为
testachieve
的成员

以下是我的主张:

List<Achievement> achievements; // Populated elsewhere
assertThat(achievements,hasItem(isA(TestAchievement.class)));
列出成就;//在别处居住
资产(成就,hasItem(isA(TestAchievement.class));
这不会编译,并报告错误:

方法断言(T,Matcher) 在类型中,断言不适用 对于参数(列表, 匹配器)


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

我已经对此进行了一段时间的研究,似乎我知道的唯一方法是将
List
转换为
List
。问题是
CoreMatchers.instanceOf()
返回
Matcher

通过这种修改,我可以让它工作:-

List<Object> achievements = new ArrayList<Object>();
achievements.add(new Achievement());
achievements.add(new TestAchievement());
assertThat(achievements, hasItem(instanceOf(TestAchievement.class)));
列表成就=新建ArrayList();
成就。添加(新成就());
成就。添加(新约成就());
资产(成就,hasItem(instanceOf(TestAchievement.class));
签名中的

assertThat(T actual, Matcher<? super T> matcher)
assertThat(成就,项目(
IsInstanceOf.instanceOf(TestAchievement.class));

谢谢你的帮助

这里的帖子暗示这是Hamcrest的一个缺陷,因此我前往hacmrest站点注册了一个bug,但我发现我使用的mvn/ivy依赖声明已经过时,这给了我一个旧版本的Hamcrest

1.1中存在此缺陷,如果使用

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

我已经为此奋斗了一段时间,这里的方法都没有达到预期的效果。出于纯粹的绝望,我尝试转换为数组,看看这是否会有所不同:

List<Object> listOfThings = (List) someService.findThings(); // your business logic here
Object[] arrayOfThings  = listOfThings.toArray(new Object[listOfThings.size()]);

assertThat(arrayOfThings, hasItemInArray(instanceOf(SpecialThing.class)));
listOfThings=(List)someService.findThings();//您的业务逻辑在这里
Object[]arrayOfThings=listOfThings.toArray(新对象[listOfThings.size()]);
资产(arrayOfThings,hasItemInArray(instanceOf(SpecialThing.class));

这确实起了作用。现在我的测试完美无瑕。一行拷贝到阵列似乎是一个合理的折衷方案,可以节省大量的麻烦。

实际上,它不适用于稍微复杂一点的Matcher,即使使用最新版本

assertThat(result.getAnswers(),
            Matchers.hasItem(Matchers.hasProperty("content")));
它将不起作用,您将得到:

类型断言中的方法assertThat(T,Matcher)不适用于参数(Set,Matcher>)

您可以通过将其转换为数组来解决此问题:

assertThat(result.getAnswers().toArray(), hasItemInArray(Matchers.hasProperty("content", equalTo("<h4>new comment</h4>"))));
assertThat(result.getAnswers().toArray(),hasItemInArray(Matchers.hasProperty(“content”),equalTo(“newcomment”));
Java 6中有一个与此相关的问题

此代码将抛出各种错误,例如“找不到符号…”

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

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

那行代码无法编译。下面是错误消息:
类型为IsInstanceOf(类)的方法instanceOf不是泛型的;它不能用参数来参数化
@limc它在主干代码中是通用的:我花了将近一周的时间在hamcrest库代码中的buggy声明这一非常相同的问题上进行了一次讨论,最后才偶然发现了固定的更新版本。简直是疯了!事情不应该这么复杂,这是一个很好的例子。适用于我,但仅适用于hamcrest 1.1。升级到1.2或1.3.0RC0会给我一个错误。错误(对于1.2)stacktrace:java.lang.NoSuchMethodError:org.hamcrest.Matcher.DescripteBommatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V位于org.hamcrest.core.IsCollectionContaining.MatchesAfly(IsCollectionContaining.java:31)org.hamcrest.core.IsCollectionContaining.MatchesAfly(IsCollectionContaining.java:14)位于org.hamcrest.TypeSafeDiagnosingMatcher.matchers(TypeSafeDiagnosingMatcher.java:54)位于org.hamcrest.matcherasert.assertThat(matcherasert.java:12)位于org.hamcrest.matcherasert.assertThat(matcherasert.java:8)@JesperRønn Jensen See。这适用于hamcrest 1.1和1.3。我通常添加注释
//解决Java 6错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7034548
每当出现此问题时。如果要避免使用基元数组,请参阅。(但仍会有一行额外的行。)
List<Object> listOfThings = (List) someService.findThings(); // your business logic here
Object[] arrayOfThings  = listOfThings.toArray(new Object[listOfThings.size()]);

assertThat(arrayOfThings, hasItemInArray(instanceOf(SpecialThing.class)));
assertThat(result.getAnswers(),
            Matchers.hasItem(Matchers.hasProperty("content")));
assertThat(result.getAnswers().toArray(), hasItemInArray(Matchers.hasProperty("content", equalTo("<h4>new comment</h4>"))));
assertThat(achievements, hasItem(isA(TestAchievement.class)));
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(isA(TestAchievement.class));
assertThat(achievements, matcher);
Matcher<TestAchievement> itemMatcher = Matchers.instanceOf(TestAchievement.class);
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(itemMatcher);
assertThat(achievements, matcher);