그래서 클래스 클래스에서 정적 변수로 모의 객체를 만들고 있습니다. 한 테스트에서는 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
해야합니다. 즉, 각 테스트에서 연결을 수행해야합니다.
답변
우선 모의를 정적으로 만들지 마십시오. 개인 필드로 만드십시오. 설정 클래스를 @Before
not 에 넣으십시오 @BeforeClass
. 무리가 될 수도 있지만 싸다.
둘째, 지금 당장 얻는 방법은 모의 시험에 따라 다른 것을 돌려주는 올바른 방법입니다.
답변
또한 연속 호출을 스터브 할 수도 있습니다 (2.8.9 API에서 # 10). 이 경우 여러 매개 변수 (varargs)와 함께 여러 thenReturn 호출 또는 하나의 thenReturn 호출을 사용합니다.
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"));
답변
또는 더 깨끗합니다.
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);