2014-06-11 6 views
0

JMockit을 사용하고 있습니다. 나는 방법을 조롱하고있다. 그 실제 메소드가 호출 되어야만 조롱 된 메소드가 한번 호출되어야한다. 내가 사용하고있는 코드를 제공하고있다. Jockock에서 조롱 중지

package StopMocking; 
public class ClassToMock 
{ 
    public int methodToMock() 
    { 
     return 2; 
    } 
} 

내가이 테스트 클래스입니다

package StopMocking; 
public class ClassToTest 
{ 
    public void methodToTest() 
    { 
     ClassToMock classToMockInstance = new ClassToMock(); 
     System.out.println(""+classToMockInstance.methodToMock()); 
    } 
} 

을 테스트하고있는 클래스입니다.

package StopMocking; 
import org.junit.Test; 
import mockit.Mocked; 
import mockit.NonStrictExpectations; 
public class TestAClass 
{ 
    @Mocked("methodToMock") ClassToMock classToMockMockedInstance; 
    @Test 
    public void test1() 
    { 

     new Expectations(classToMockMockedInstance) 
     { 
      { 
      classToMockMockedInstance.methodToMock();returns(1); 
      } 
     }; 

     (new ClassToTest()).methodToTest(); 
     //Some code for stoping mocking 
     (new ClassToTest()).methodToTest();//It should display 2 

    } 
} 

나는 새로운 기대 (classToMockMockedInstance)를 사용하고는이 예외를 던지고있다

테스트를 작성하는
mockit.internal.MissingInvocation: Missing invocation of: 
StopMocking.ClassToMock#methodToMock() 
    on mock instance: [email protected] 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: Missing invocation 
    at StopMocking.ClassToMock.methodToMock(ClassToMock.java) 
    at StopMocking.TestAClass$1.<init>(TestAClass.java:21) 
    at StopMocking.TestAClass.test1(TestAClass.java:18) 
    ... 6 more 
+1

그냥 두 가지 테스트를 작성할 수 있습니까? 하나는 조롱으로, 다른 하나는 테스트없이 작성할 수 있습니까? –

+0

@ Rogério에 관심을 가져 주셔서 감사합니다. 이 특별한 예제에서는 두 가지 테스트 케이스를 작성할 수 있습니다. 그러나 이것은 sceneario입니다. JMockit이나 다른 옵션에서 사용할 수있는 기능이있는 경우 해당 메서드를 조롱 한 후 메서드를 한 번만 호출한다는 것을 알고 싶습니다. – Varun

+0

예, 부분적으로 조롱 된 인스턴스에 * strict expectation을 기록 할 수 있습니다 :'new Expectations (someObj) {...}'. 첫 번째 호출 만이 예상과 일치합니다. 추가 호출이 있으면 실제 코드가 실행됩니다. 또 다른 방법은 Delegate 메소드의'proceed()'에 대한 조건부 호출과 함께'Delegate' 객체를 사용하는 것입니다.이 메소드는 첫 번째 매개 변수가'Invocation' 유형입니다. 공식 문서에 많은 예제가 있으므로 여기에 예제를 제공하지 않겠습니다. –

답변

1

한 가지 방법은 부분적인 조롱과 엄격한 기대 사용하여 다음과 같이이다 :

public class TestAClass 
{ 
    @Test 
    public void test1() 
    { 
     final ClassToMock classToMockInstance = new ClassToMock(); 

     new Expectations(ClassToMock.class) {{ 
      classToMockInstance.methodToMock(); result = 1; 
     }}; 

     new ClassToTest().methodToTest(); // prints "1" 

     // This time the real method implementation will be executed: 
     new ClassToTest().methodToTest(); // prints "2" 
    } 
} 
+0

또 다른 질문은, 어떻게 paritally 인터페이스를 모의. Expectations에서 인터페이스 이름을 전달하면 IllegalArgumentException이 발생합니다. 감사합니다. – Varun

+0

인터페이스를 부분적으로 조롱 했습니까? 일반적으로, 당신은하지 않습니다. 'Expectations'를 통한 일부 조롱은 구현 코드가 포함 된 클래스에만 해당됩니다. –

+0

도움 주셔서 감사합니다. – Varun