2013-05-29 5 views
16

내 JUnit 테스트에서 모의 ​​객체를 만들 때 Mockito framework을 사용하고 있습니다. 그것이라는 것을이 내부 모의 지식은 내 테스트를 통해 지속됩니다 만약 내가 궁금각 테스트마다 모의 객체가 재설정됩니까?

verify(myMock, atLeastOnce()).myMethod(); 

각각의 모의는 메소드가 불려 된 것을 알고, 그래서 내 테스트를하는 동안 나는 쓸 수있다? 지속성이 있다면 두 번의 테스트에서 동일한 verify 메서드를 사용할 때 위양성을 얻을 수 있습니다.

@RunWith(MockitoJUnitRunner.class) 
public class EmrActivitiesImplTest { 

    @Mock private MyClass myMock; 

    @Before 
    public void setup() { 
     when(myMock.myMethod()).thenReturn("hello"); 
    } 

    @Test 
    public void test1() { 
     // ..some logic 
     verify(myMock, atLeastOnce()).myMethod(); 
    } 

    @Test 
    public void test2() { 
     // ..some other logic 
     verify(myMock, atLeastOnce()).myMethod(); 
    } 
} 

모의 상태가 유지되는 코드 예 - TEST1 년대 방법

통과 확인 이후 TEST2 관계없이 합격

모의 상태를 리셋 - myMock.myMethod()가 아닌 경우 TEST2가 실패

+0

내가 잘못하지 않았다면, 모든 테스트를하기 전에 한 번 설정이 호출됩니다. 그렇습니다. 모든 테스트에서 동일한 모의 객체가 사용됩니다. 각 테스트 메소드의 시작 부분에 해당 객체를 생성해야합니다. –

답변

20

JUnit은 새 테스트 메소드를 실행할 때마다 테스트 클래스의 새 인스턴스를 만들고 새 테스트 클래스를 작성할 때마다 @Before 메소드를 실행합니다. 당신은 쉽게

@Before 
public void setup() { 
     System.out.println("setup"); 
     when(myMock.myMethod()).thenReturn("hello"); 
} 

을 테스트 할 수 있습니다 그리고 MockitoJUnitRunner은 모든 시험 방법이 통과

+8

이것이 맞습니다. ** JUnit ** 디자이너는 테스트 메소드간에 테스트 격리를 원했기 때문에 각 테스트 메소드를 실행하기위한 테스트 클래스의 새 인스턴스를 만듭니다. ** TestNG ** creator는 다른 방식으로 테스트 클래스별로 격리를 선택 했으므로 TestNG 테스트의 테스트 메소드간에 격리가 없음을 의미합니다. 따라서 각 테스트 메소드간에 인스턴스 모의 객체를 재설정해야 할 수도 있습니다. – Brice

+0

그리고 이것은 조롱이 첫 번째 테스트에만 맞기 때문에 싱글 톤을 사용할 때 큰 문제입니다 ... –

+0

이것이 문서화 된 곳을 찾았습니까? 나는 잠시 동안이 사실을 알았지 만, 누군가가 묻고 나서 나는 어디에서나 의사를 찾을 수는 없다. – dsingleton

0

setup에서 모의 ​​객체를 초기화하는 경우 각 테스트에서 다른 기능을 제공 할 수 있습니다. 한 번 초기화하고 이후에 테스트 당 행동/예상 방식을 변경할 수 있습니다.

12
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import static org.mockito.Mockito.*; 

@RunWith(MockitoJUnitRunner.class) 
public class sandbox { 

    @Mock 
    private MyClass myMock; 

    @Before 
    public void setup() { 
     when(myMock.myMethod()).thenReturn("hello"); 
    } 

    @Test 
    public void test1() { 
     myMock.myMethod(); 
     verify(myMock, times(1)).myMethod(); 
    } 

    @Test 
    public void test2() { 
     myMock.myMethod(); 
     verify(myMock, times(1)).myMethod(); 
    } 

} 

에 대한 새로운 MyMock 모의 인스턴스를 생성합니다. 상태가 지속되면 두 번째 테스트가 실패합니다. 디버그하면 각 테스트에 대한 조롱 된 객체의 새 인스턴스를 얻게됩니다.

+0

예, 동의합니다. @RunWith (MockitoJUnitRunner.class)가 사용되면 새로운 모의가 삽입됩니다. – yuranos87

관련 문제