我正在使用JUnit-dep 4.10和Hamcrest 1.3.RC2.
我创建了一个自定义匹配器,如下所示:
public static class MyMatcher extends TypeSafeMatcher<String> {
@Override
protected boolean matchesSafely(String s) {
/* implementation */
}
@Override
public void describeTo(Description description) {
/* implementation */
}
@Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
Run Code Online (Sandbox Code Playgroud)
使用Ant从命令行运行时,它完全正常.但是当从IntelliJ运行时,它失败了:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
Run Code Online (Sandbox Code Playgroud)
我的猜测是它使用了错误的hamcrest.MatcherAssert.我如何找到它使用的hamcrest.MatcherAssert(即哪个jar文件用于hamcrest.MatcherAssert)?AFAICT,我班级路径中唯一的火腿罐是1.3.RC2.
IntelliJ IDEA使用它自己的JUnit或Hamcrest副本吗?
如何输出IntelliJ正在使用的运行时CLASSPATH?
当我查看Assert类JavaDoc中的示例时
assertThat("Help! Integers don't work", 0, is(1)); // fails:
// failure message:
// Help! Integers don't work
// expected: is <1>
// got value: <0>
assertThat("Zero is one", 0, is(not(1))) // passes
Run Code Online (Sandbox Code Playgroud)
比方说,我没有看到一个很大的优势assertEquals( 0, 1 ).
如果构造变得更复杂但是你看到更多的优点,那么对于消息可能很好吗?可读性?
我想知道是否有人知道如何使用assertThat()和检查列表是否为空Matchers?
我只能使用JUnit的最佳方式:
assertFalse(list.isEmpty());
Run Code Online (Sandbox Code Playgroud)
但我希望在Hamcrest有一些方法可以做到这一点.
我怎么assertThat样null?
例如
assertThat(attr.getValue(), is(""));
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误,说我不能null进去is(null).
在运行junit测试时,eclipse我得到了这个Exception:
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
Run Code Online (Sandbox Code Playgroud)
我添加了junit.jar库文件.
我试过不同版本的junit.jar的:4.4,4.8等等.
如何修复此异常?
我想比较2个列表:
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));
Run Code Online (Sandbox Code Playgroud)
但想法
java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
(no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
Run Code Online (Sandbox Code Playgroud)
我该怎么写呢?
假设我想使用此签名对方法进行单元测试:
List<MyItem> getMyItems();
Run Code Online (Sandbox Code Playgroud)
假设MyItem是一个Pojo,它有许多属性,其中一个是"name"通过访问的getName().
我关心验证的是List<MyItem>,或者任何Iterable,包含两个MyItem实例,其"name"属性具有值"foo"和"bar".如果任何其他属性不匹配,我真的不关心此测试的目的.如果名称匹配,则是成功的测试.
如果可能的话,我希望它是单行的.这是我想要做的事情的一些"伪语法".
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Run Code Online (Sandbox Code Playgroud)
哈姆克雷斯特会对这类事情有好处吗?如果是这样,我上面的伪语法的hamcrest版本到底是什么?
我无法理解JUnit 4.8应该如何与Hamcrest匹配器一起使用.有内部定义了一些匹配器junit-4.8.jar在org.hamcrest.CoreMatchers.同时,也有一些其他的匹配器hamcrest-all-1.1.jar中org.hamcrest.Matchers.那么,去哪里?我应该在项目中明确包含hamcrest JAR并忽略JUnit提供的匹配器吗?
特别是,我对empty()匹配器很感兴趣,并且无法在任何这些罐子中找到它.我需要别的吗?:)
还有一个哲学问题:为什么JUnit将org.hamcrest包装包含在自己的发行版中而不是鼓励我们使用原始的hamcrest库?
我对匹配者比较陌生.我正在和Hamcrest一起玩 JUnit并且我喜欢它.
有没有办法说明多种选择中的一种是正确的?
就像是
assertThat( result, is( either( 1, or( 2, or( 3 ) ) ) ) ) //does not work in hamcrest
Run Code Online (Sandbox Code Playgroud)
我正在测试的方法返回一个集合的一个元素.该列表可能包含多个候选人.我当前的实现返回第一个命中,但这不是必需的.如果返回任何可能的候选人,我希望我的测试用例成功.你会怎么用Java表达这个?
(我对hamcrest替代品持开放态度)
它看起来像hamcrest org.hamcrest.Matchers类非常相似org.hamcrest.CoreMatchers(虽然看起来Matchers有更多).为什么我会选择使用CoreMatchers(除了它看起来类似稍小),为什么这两个类如此相似?
hamcrest ×10
java ×9
junit ×8
junit4 ×3
assert ×1
collections ×1
eclipse ×1
matcher ×1
testing ×1
unit-testing ×1