2014-04-15 2 views
1

jMock을 원하는 기대치와 정확하게 일치시키는 데 문제가 있습니다. 두 개의 다른 매개 변수를 사용하여 mock 객체에서 여러 번 호출 할 메소드가 있습니다. 메서드가 각 매개 변수에 대해 다른 값을 반환하기를 원합니다. 불행히도 두 번째 매개 변수를 사용하여 메서드를 호출하려고하면 결과는 org.hamcrest.Matcher.describeMismatch의 NoSuchMethodError가됩니다.허용 호출 카운트를 사용하는 동안 jMock의 매개 변수 값 일치

여기 제가 수행하려고 시도하는 샘플입니다.

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) 

답변

0

문제점은 내가 포함하고있는 항아리에 관한 것이 었습니다. JUnit jar에는 hamcrest jar의 클래스와 충돌하는 hamcrest 클래스가 있습니다. hamcrest jar가 JUnit jar 앞에 추가되도록 classpath를 재정렬 할 수있었습니다.