Tag: hamcrest

NoClassDefFoundError:使用PowerMock-OSGi的org / hamcrest / Matchers

当我运行我的测试作为OSGi PlugIn测试时,我得到org.hamcrest.Matchers的NoClassDefFoundError,但是当我将其作为普通JUnit运行时测试everthing按预期工作。 我正在使用OSMi版本的PowerMock,并在我的启动配置中包含所有必要的依赖项。 我做错了什么? 由于某些原因,似乎Testrunner没有看到这个class级。 编辑:我创建了一个简化的示例项目,并发现问题只出现在我的类声明中使用@PrepareForTest(XXX.class)时。 java.lang.NoClassDefFoundError: org/hamcrest/Matchers at eu.gemtec.commons.util.assertion.Assert.assertParamNotNull(Assert.java:107) at eu.gemtec.eagle.device.aastra.omaxi.core.system.model.impl.MessageHandleFactory.(MessageHandleFactory.java:72) at eu.gemtec.eagle.device.aastra.omaxi.core.system.model.impl.TestMessageHandleFactory.setUp(TestMessageHandleFactory.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$LastRuleTestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:148) at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:91) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) […]

是否有一个使用Hamcrest’describeMismatch’function的JUnit断言版本?

在我尝试过的每个JUnit版本中(最多4.8.1),一个失败的assertThat会显示一条错误消息,如下所示: 预期的:[describeTo] 得到:[对象的字符串表示] 换句话说,它将显示对象的toString()而不是Matcher的不匹配描述。 如果我使用org.hamcrest.MatcherAssert.assertThat中的assertThat,那么它将调用’describeMismatch’并显示更有用的错误消息。 我是否错误地使用了Junit,或者目前没有JUnit版本能够满足我的需求吗? 那么大多数人都会使用Hamcrest声明吗?

Hamcrest匹配器的重载冲突

匹配器IsIterableContainingInAnyOrder对静态工厂方法containsInAnyOrder有两个重载(两者都有返回类型Matcher<java.lang.Iterable> ): containsInAnyOrder(java.util.Collection<Matcher> itemMatchers) containsInAnyOrder(Matcher… itemMatchers) 现在考虑以下程序: import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; import java.util.Arrays; import org.junit.Test; public class SomeTest { @SuppressWarnings(“unchecked”) @Test public void foo() { assertThat(Arrays.asList(“foo”,”bar”), containsInAnyOrder(equalTo(“foo”), equalTo(“bar”))); } } 当它作为JUnit测试执行时,它会按预期传递。 它使用上面显示的containsInAnyOrder的第二个重载。 现在,当我将断言更改为this时(它与第一次重载的文档中给出的示例完全匹配): assertThat(Arrays.asList(“foo”,”bar”), containsInAnyOrder(Arrays.asList(equalTo(“foo”), equalTo(“bar”)))); ^^^^^^^^^^^^^^ 它不再编译,因为现在编译器推断出containsInAnyOrder的返回类型 Matcher<Iterable<? extends List<Matcher>>> 似乎编译器仍然选择第二个重载。 如果它使用了第一个,那么示例应该有效。 为什么它会像这样? 我怎样才能做到这一点? 我正在使用Hamcrest 1.3和Oracle Java 1.7。

Hamcrest – 使用什么版本? 1.3或2

我很困惑。 目前我正在测试我的弹簧应用程序 org.springframework.boot spring-boot-starter-test test 只要我想匹配RegularExpressions,我就开心了。 在hamcrest 1.3中你需要编写自己的匹配器,我不喜欢这么多。 我搜索并发现hamcrest 2.0内置了一些内容,例如: assertThat(DateHelper.getActualDateForXML(), MatchesPattern.matchesPattern(“\\d{4}+-\\d{2}-+\\d{2}+T\\d{2}+:\\d{2}+:\\d{2}+”)); 我很高兴,我补充说: org.hamcrest hamcrest-junit 2.0.0.0 test 并从spring-boot-starter-test中踢出了1.3个hamcrest依赖项: org.hamcrest hamcrest-library org.hamcrest hamcrest-core 现在一切都在按照我的预期工作,但我觉得不舒服。 因为我可以找到人们写的关于1.3并且无法真正找到使用hamcrest-junit 2.0的人。 有人可以解释一下他们之间的联系吗? 因为似乎hamcrest-junit 2.0的所有内容都来自hamcrest 1.3 … 谢谢本

使用MockMvc的Hamcrest:检查该键是否存在但值可能为null

我正在使用MockMvc进行一些测试,我想validationJSON响应的结构。 具体来说,我想确保属性的键存在,并且该值是某个类型或null。 { “keyToNull”: null, # This may be null, or a String “keyToString”: “some value” } 以下对我有用,但我想知道是否有办法将每组两个期望合并为一行,因为我有很多要检查的属性: import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.hamcrest.Matchers.*; .andExpect(jsonPath(“$”).value(hasKey(“keyToNull”))) .andExpect(jsonPath(“$.keyToNull”).value( anyOf(any(String.class), nullValue(String.class)))) .andExpect(jsonPath(“$”).value(hasKey(“keyToString”))) .andExpect(jsonPath(“$.keyToString”).value( anyOf(any(String.class), nullValue(String.class)))) hasKey()是必需的,因为另一个断言本身通过,因为MockMvc的实现映射中不存在的键映射为null: .andExpect(jsonPath(“$.notAKey”).value( anyOf(any(String.class), nullValue(String.class)))) // ok jsonPath().exists()也不起作用,因为在内部它将值与null进行比较。 我考虑过这样一个单独的方法: private static void assertNullableAttr(ResultActions res, String jsonPath, Class type) throws Exception { int split = […]

在Hamcrest中进行测试,该列表仅存在具有特定属性的列表中的一个项目

使用Hamcrest,我们可以轻松地测试存在具有特定属性的列表中的至少一个项目,例如 List myList = …. MatcherAssert.assertThat(myList, Matchers.hasItem(Matchers.hasProperty(“fieldName”, Matchers.equalTo(“A funny string”))))); Pojo类是这样的: public class Pojo{ private String fieldName; } 这很好,但是如何检查列表中是否只有一个具有特定属性的对象?

Mockito和Hamcrest:如何validationCollection参数的调用?

我遇到了Mockito和Hamcrest的仿制问题。 请假设以下界面: public interface Service { void perform(Collection elements); } 以下测试片段: Service service = mock(Service.class); // … perform business logic verify(service).perform(Matchers.argThat(contains(“a”, “b”))); 所以我想validation我的业务逻辑实际上是用这个顺序包含“a”和“b”的集合调用服务。 但是, contains(…)的返回类型是Matcher<Iterable> Matcher<Iterable> ,所以Matchers.argThat(…)在我的情况下返回Iterable ,这自然不适用于所需的Collection 。 我知道我可以使用Hamcrest hasItem和Mockito中提出的参数捕获器validation不一致 ,但我非常愿意不这样做。 有什么建议! 谢谢!

Mockito,JUnit,Hamcrest,Versioning

默认情况下,Hamcrest所需的版本为: JUnit 4.11 Hamcrest 1.3 Mockito核心1.9.5 Hamcrest 1.1 Hamcrest 1.1和1.3之间没有重要的API变化。 目前我的测试用例试图用Hamcrest 1.1运行JUnit 4.11,但我有理由相信这是一个坏主意。 出于类似的原因,我怀疑尝试将Mockito-core 1.9.5与Hamcrest 1.3一起使用也是一个坏主意。 该怎么办? 将Hamcrest 1.1与最新的JUnit和Mockito一起使用 将Hamcrest 1.3与最新的JUnit和Mockito一起使用 尝试修补Mockito-core 1.9.5以使用Hamcrest 1.3 我此刻没有的时间 使用JUnit 4.10 其他? 更新2015-06-12: Mockito 1.10.19和2.0.13-beta仍然使用Hamcrest 1.1

Java 8 – 重试方法,直到满足条件(间隔)

我想创建一个可以运行方法的类,直到满足返回值的条件。 看起来应该是这样的 methodPoller.poll(pollDurationSec, pollIntervalMillis) .method(dog.bark()) .until(dog -> dog.bark().equals(“Woof”)) .execute(); 我的方法poller看起来有点像这个()//跟随GuiSim回答 public class MethodPoller { Duration pollDurationSec; int pollIntervalMillis; public MethodPoller() { } public MethodPoller poll(Duration pollDurationSec, int pollIntervalMillis) { this.pollDurationSec = pollDurationSec; this.pollIntervalMillis = pollIntervalMillis; return this; } public MethodPoller method(Supplier supplier) { return this; } public MethodPoller until(Predicate predicate) { return this; } } […]

混合Hamcrest和TestNG

有没有人将Hamcrest与TestNG集成在一起,以便它的匹配器可以很容易地用于TestNG断言?