そこで、クラス レベルで静的変数としてモック オブジェクトを作成しています。1 つのテストでは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.
}
}
2 番目のテストでは、testObj.bar() が呼び出されたときに、値として 0 がまだ返されます... これを解決する最善の方法は何ですか?Foo
各テストで の異なるモックを使用できることはわかっていますが、 から複数のリクエストを連鎖させる必要があるmockFoo
ため、各テストで連鎖させる必要があることに注意してください。
ベストアンサー1
また、スタブ連続呼び出し(2.8.9 API の #10) この場合、複数のthenReturn呼び出しを使用するか、複数のパラメーター (varargs) を持つ1 つの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
}
}