sourcecode

모키토 모조 오브젝트가 다음에 호출되었을 때 다른 것을 반환하도록 지시하려면 어떻게 해야 합니까?

copyscript 2022. 11. 16. 21:20
반응형

모키토 모조 오브젝트가 다음에 호출되었을 때 다른 것을 반환하도록 지시하려면 어떻게 해야 합니까?

이렇게 클래스 레벨에서 정적 변수로 모의 객체를 만듭니다.한 번의 테스트에서 나는Foo.someMethod()특정 값을 반환하는 경우 다른 테스트에서는 다른 값을 반환해야 합니다.문제는 제대로 작동하려면 모크를 다시 조립해야 할 것 같다는 것입니다.저는 모크를 재구축하는 것을 피하고 각 테스트에서 같은 오브젝트를 사용하고 싶습니다.

class TestClass {

    private static Foo mockFoo;

    @BeforeClass
    public static void setUp() {
        mockFoo = mock(Foo.class);
    }

    @Test
    public void test1() {
        when(mockFoo.someMethod()).thenReturn(0);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value

    }

    @Test
    public void test2() {
        when(mockFoo.someMethod()).thenReturn(1);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.

    }

}

두 번째 테스트에서는 testObj.bar()이 호출되었을 때 값으로 0이 표시됩니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까?다른 모의실험을 사용할 수 있다는 것을 알고 있습니다.Foo그러나 각 테스트에서 여러 요청을 체인으로 분리해야 합니다.mockFoo각 테스트마다 체인을 해야 한다는 뜻이죠

연속 콜을 스터브할 수도 있습니다(2.8.9 api의 #10).이 경우 복수의 then Return 콜 또는 복수의 파라미터(varargs)를 가진1개의 return 콜을 사용합니다.

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class TestClass {

    private Foo mockFoo;

    @Before
    public void setup() {
        setupFoo();
    }

    @Test
    public void testFoo() {
        TestObject testObj = new TestObject(mockFoo);

        assertEquals(0, testObj.bar());
        assertEquals(1, testObj.bar());
        assertEquals(-1, testObj.bar());
        assertEquals(-1, testObj.bar());
    }

    private void setupFoo() {
        mockFoo = mock(Foo.class);

        when(mockFoo.someMethod())
            .thenReturn(0)
            .thenReturn(1)
            .thenReturn(-1); //any subsequent call will return -1

        // Or a bit shorter with varargs:
        when(mockFoo.someMethod())
            .thenReturn(0, 1, -1); //any subsequent call will return -1
    }
}

무언가를 반환하기 위해 검색한 모든 사용자 및 다른 콜 송출 예외:

when(mockFoo.someMethod())
        .thenReturn(obj1)
        .thenReturn(obj2)
        .thenThrow(new RuntimeException("Fail"));

또는

when(mockFoo.someMethod())
        .thenReturn(obj1, obj2)
        .thenThrow(new RuntimeException("Fail"));

먼저, 모의 정전기 방지 장치를 만들지 마십시오.개인 분야로 해 주세요.셋업 클래스를@Before것은 아니다.@BeforeClass많이 운영되긴 하지만 싸요.

두 번째, 지금 가지고 있는 방법은 모의고사가 시험에 따라 다른 것을 돌려주도록 하는 올바른 방법입니다.

또는 더 깔끔한 경우도 있습니다.

when(mockFoo.someMethod()).thenReturn(obj1, obj2);

when() 메서드 대신 spy() 및 doReturn()을 사용하는 모든 사용자의 경우:

콜마다 다른 오브젝트를 반환하기 위해 필요한 것은 다음과 같습니다.

doReturn(obj1).doReturn(obj2).when(this.spyFoo).someMethod();

.

클래식 모크의 경우:

when(this.mockFoo.someMethod()).thenReturn(obj1, obj2);

또는 예외가 발생하는 경우:

when(mockFoo.someMethod())
        .thenReturn(obj1)
        .thenThrow(new IllegalArgumentException())
        .thenReturn(obj2, obj3);

언급URL : https://stackoverflow.com/questions/4216569/how-to-tell-a-mockito-mock-object-to-return-something-different-the-next-time-it

반응형