そのため、クラスレベルの静的変数としてモックオブジェクトを作成しています。あるテストでは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
から複数のリクエストをチェーンする必要があります。つまり、各テストでチェーンを実行する必要があります。
まず、モックを静的にしないでください。プライベートフィールドにします。 setUpクラスを@Before
ではなく@BeforeClass
に配置するだけです。それはたくさん実行されるかもしれませんが、それは安いです。
第二に、今あなたがそれを持っている方法は、テストに応じて異なるものを返すようにモックを取得する正しい方法です。
スタブ連続呼び出し (2.8.9 APIの#10)この場合、複数のthenReturn呼び出しまたは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
}
}
何かを返すために検索し、その後別の呼び出し例外をスローする場合:
when(mockFoo.someMethod())
.thenReturn(obj1)
.thenReturn(obj2)
.thenThrow(new RuntimeException("Fail"));
または
when(mockFoo.someMethod())
.thenReturn(obj1, obj2)
.thenThrow(new RuntimeException("Fail"));
when()メソッドの代わりにspy()およびdoReturn()を使用している場合:
異なる呼び出しで異なるオブジェクトを返す必要があるのはこれです:
doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
または、さらにきれいに:
when(mockFoo.someMethod()).thenReturn(obj1, obj2);