java - 使用允许的调用计数时匹配 jMock 中的参数值

标签 java junit4 jmock

我在让 jMock 正确匹配我想要的期望时遇到问题。我有一个方法,我想使用两个不同的参数多次调用模拟对象。我希望该方法为每个参数返回不同的值。不幸的是,当我尝试使用第二个参数调用该方法时,结果是 org.hamcrest.Matcher.describeMismatch 的 NoSuchMethodError。

这是我正在尝试做的事情的示例。

import static org.hamcrest.Matchers.*;
import org.jmock.Expectations;
import static org.jmock.Expectations.*;
import org.jmock.auto.Mock;
import org.jmock.integration.junit4.JUnitRuleMockery;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;

public class JMockTest {
    interface A {
        int foo(int x);
    }

    @Rule
    public final JUnitRuleMockery context = new JUnitRuleMockery();
    @Mock
    private A a;

    @Test
    public void testFoo() {
        context.checking(new Expectations() {{
            allowing(a).foo(1); will(returnValue(1));
            allowing(a).foo(2); will(returnValue(2));
        }});
        assertThat(a.foo(1), is(1));
        assertThat(a.foo(2), is(2));
    }
}

我正在使用 jMock 2.6.0 和 JUnit 4.10。我正在使用 hamcrest-core-1.3.jar、hamcrest-library-1.3.jar、jmock-2.6.0.jar 和 jmock-junit4-2.6.0.jar。

如果我将允许调用更改为 oneOf 调用,则测试通过。 jMock 食谱( http://jmock.org/parameters.html )给出了一个与我的非常相似的示例,所以我希望在这种情况下我应该能够使用允许。

这是我尝试运行测试时的输出。

Testcase: testFoo(JMockTest):   Caused an ERROR
org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
    at org.jmock.internal.matcher.AllParametersMatcher.matchesParameter(AllParametersMatcher.java:61)
    at org.jmock.internal.matcher.AllParametersMatcher.matchesParameters(AllParametersMatcher.java:47)
    at org.jmock.internal.matcher.AllParametersMatcher.matchesSafely(AllParametersMatcher.java:31)
    at org.jmock.internal.matcher.AllParametersMatcher.matchesSafely(AllParametersMatcher.java:13)
    at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
    at org.jmock.internal.InvocationExpectation.matches(InvocationExpectation.java:147)
    at org.jmock.internal.InvocationDispatcher.dispatch(InvocationDispatcher.java:80)
    at org.jmock.Mockery.dispatch(Mockery.java:231)
    at org.jmock.Mockery.access$100(Mockery.java:29)
    at org.jmock.Mockery$MockObject.invoke(Mockery.java:271)
    at org.jmock.internal.InvocationDiverter.invoke(InvocationDiverter.java:27)
    at org.jmock.internal.FakeObjectMethods.invoke(FakeObjectMethods.java:38)
    at org.jmock.internal.SingleThreadedPolicy$1.invoke(SingleThreadedPolicy.java:21)
    at org.jmock.lib.JavaReflectionImposteriser$1.invoke(JavaReflectionImposteriser.java:33)
    at $Proxy6.foo(Unknown Source)

最佳答案

事实证明问题出在我所包含的 jar 上。 JUnit jar 包含一些与 hamcrest jar 中的类冲突的 hamcrest 类。我能够重新排列类路径,以便在 JUnit jar 之前添加 hamcrest jar。

关于java - 使用允许的调用计数时匹配 jMock 中的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088163/

相关文章:

java - 将 PGraphics 的 ArrayList 的创建从主类重构到单独的类时出现空指针异常

java - 多次调用运行 Android 测试 setUp() 方法

java - jMock - 允许()多次调用并产生不同的结果

java - JUnit 模拟,我应该使用哪个工具?

spring - Spring @DirtiesContext 是否重新加载 Spring 上下文?

Java JDI 转换为实际的真实类型

java - VertX 与 Jetty 性能问题

java - Spring 中是否有 ServiceLoader 的类似物以及如何使用它?

java - EclEmma 代码覆盖忽略 Junit 测试

java - junit 上的 org/hamcrest/Matchers 上出现 NoClassDefFoundError