我刚开始使用Hamcrest,所以我可能做错了。
我有List<Foo> foos
,Foo
界面看起来有点像这样:
public abstract interface Foo {
public String getBar();
}
由impl.FooImpl
:
public class FooImpl implements Foo {
protected String _bar = "some value";
public String getBar() {
return _bar;
}
}
我的断言看起来像这样:
assertThat(
foos,
Matchers.hasItem(
Matchers.<Foo> hasProperty(
"bar",
equalTo("some value")
)
)
);
不幸的是,JUnit / Hamcrest并不高兴:
java.lang.AssertionError:
Expected: a collection containing hasProperty("bar", "someValue")
got: <[com.example.impl.FooImpl@2c78bc3b]>
知道我需要做些什么才能解决这个问题?
更新:我的“测试”课程就在这里:
public class FooTest {
public static void main(String... args) throws Exception {
List<Foo> foos = Arrays.<Foo> asList(new FooImpl());
assertThat(
foos,
Matchers.<FooImpl> hasItem(Matchers.hasProperty("bar", equalTo("some value")))
);
}
}
显然,我希望看到的是断言传递而不会出现例外......:)
更新:现在已修复;我刚刚在IntelliJ中设置了一个空白的maven项目,它运行良好。它可能是一个错字,或者我在Eclipse中导入错误的方法,但它肯定是OSI第8层问题。我要求关闭谈话。对不起大家,谢谢你的帮助。
答案 0 :(得分:1)
您发布的代码运行正常。您遇到的错误是由于您在本地运行的代码中的"someValue"
和"some value"
不匹配。升级到Hamcrest 1.3,您将收到更清晰的错误消息:
Expected: a collection containing hasProperty("bar", "someValue")
but: property 'bar' was 'some value'
由于你可能得到不同的结果,这里有一个完整的例子,通过JUnit 4.11和Hamcrest 1.3。在Foo.java
:
public class Foo {
public String getBar() {
return "some value";
}
}
在FooTest.java
:
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.List;
import org.hamcrest.Matchers;
import org.junit.Test;
public class FooTest {
@Test
public void test() {
List<Foo> foos = Arrays.asList(new Foo());
assertThat(foos,
Matchers.<Foo>hasItem(Matchers.hasProperty("bar", Matchers.equalTo("some value"))));
}
}
如果我故意通过将测试中的属性名称更改为"notbar"
来破解此测试,那么我得到:
java.lang.AssertionError:
Expected: a collection containing hasProperty("notbar", "some value")
but: No property "notbar"
相反,如果我通过期待"some other value"
来打破它,那么我得到:
java.lang.AssertionError:
Expected: a collection containing hasProperty("bar", "some other value")
but: property 'bar' was "some value"
如果您遇到不同或不太清楚的错误,则可能会遇到另外的问题。