2016-06-16 3 views
1

일반적으로 Expectations은 differnt 반환 값으로 값을 모의하는 데 사용된다는 것을 알고 있습니다. 예를 들면 다음과 같습니다.결과가없는 Expectations 블록과 Verifications 블록이 동일한 것입니까?

new Expectations() {{ 
    bar.getGreeting(); 
    result = "Hello, world!"; 
    times = 2; 
}}; 

나는 result이 선택 사항임을 알아 챘습니다. 이 시점에서이 블록은 메서드가 두 번 호출되었다는 것을 확인하고 그렇지 않으면 MissingInvocation 오류를 발생시킵니다. 그래서 예를 들면 :

@Test 
public void testRunFoo(@Mocked final Bar bar) { 
    Foo foo = new Foo(bar); 

    foo.runFooWithBarTwice(); //Successful 
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException 

    new Verifications() {{ 
     bar.runBar(); 
     times = 2; 
    }}; 
} 

Expectations 블록 결과없이 같은 일을 Verifications 블록으로 :

@Test 
public void testRunFoo(@Mocked final Bar bar) { 
    Foo foo = new Foo(bar); 
    new Expectations() {{ 
     bar.runBar(); 
     times = 2; 
    }}; 

    foo.runFooWithBarTwice(); //Successful 
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException 
} 

내가 대신 Verifications을 사용하는 것으로이 코드는 같은 일 것으로 보인다 것으로 나타났습니다? 당신은 당신의 개인 취향에 따라 어느 쪽을 사용할 수 있습니까? 아니면 두 사람 사이에 미묘한 차이가 있습니까?

답변

3

둘 다 비슷하게 작동한다는 것이 맞습니다. Expectations 블록에서 상호 작용을 조롱하는 경우 Verifications 블록에 삽입하는 것과 유사하게 확인됩니다.

http://jmockit.org/gettingStarted.html의 소개 페이지에서 JMockit의 디자인 철학을 보면, 그것은 다음과 같은 패턴

@Test 
public void aTestMethod(<any number of mock parameters>) 
{ 
    // Record phase: expectations on mocks are recorded; empty if nothing to record. 

    // Replay phase: invocations on mocks are "replayed"; code under test is exercised. 

    // Verify phase: expectations on mocks are verified; empty if nothing to verify. 
} 

테스트중인 코드를 확인하지 않는 Record 단계의 목적으로 쓰기 테스트를 권장합니다 테스트중인 코드가 테스트를 실행하는 데 필요한 종속성과 상호 작용을 갖도록 보장해야합니다. 따라서 Expectations 블록의 목적은 모의 객체가 Replay 단계에서 테스트중인 코드와 상호 작용하기 위해 특정 작업을 수행해야하는 모든 상호 작용을 기록하는 것입니다. 이것은 일반적으로 특정 값을 반환하거나 올바른 조롱 된 객체가 상호 작용에 사용되는지 확인하는 것을 의미합니다.

위의 JMockit 문서의 세 가지 설명을 내 단위 테스트에 넣어 테스트 문서화에 도움을 주기도합니다.

마지막으로, Verifications 블록은 일반적으로 모의 객체 상호 작용에 대한 검증을 수행하는 곳입니다. Verifications 블록 이전, 이후 또는 그 안에 표준 Junit 어설 션을 사용할 수도 있습니다.