どのように伝えるMockito模擬オブジェクトを返すものです。
-
26-09-2019 - |
質問
なので、私の作成、模擬オブジェクトとしての静的変数のクラスのレベルのようなので---一つの試験したい 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.
}
}
第二次試験の私を受けているところであるが0としての価値がtestObj.バー()が呼び出される...には、どうするのがベストな解決。ご注意思いが異なる模擬の Foo
試験では、しかしながら、チェーンは複数の要求をoff mockFoo
, と思い、チェーンの各テストです。
解決
まず第一には、モックの静的をすることはありません。それプライベートフィールドを確認します。ただ、@Before
ない@BeforeClass
であなたのセットアップクラスを置きます。それは束を実行される可能性がありますが、それは安いです。
第二に、あなたは今それを持っている方法は、テストに応じて、別の何かを返すためにモックを取得するための正しい方法です。
他のヒント
このまま スタブを連続通話 (#10 2.8.9供している。この場合、複数の 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);
スパイを使用して人のための
の()をdoReturn()の代わりに()メソッドの
あなたが別の通話に別のオブジェクトを返すために必要なものは以下です:
doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
所属していません StackOverflow