2010-11-18 3 views
132

私はクラスレベルで静的変数としてモックオブジェクトを作成しています... 1つのテストでは、Foo.someMethod()を特定の値に戻したいが、別のテストでは別の値を返すようにしたい。私が抱えている問題は、正しく動作するようにモックを再構築する必要があるということです。私はモックを再構築しないようにしたいですし、各テストで同じオブジェクトを使用するだけです。第二の試験で Mockitoモックオブジェクトに次回呼び出されたときに何か別のものを返すように指示するには?

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から複数のリクエストをチェーンしなければならないことに注意してください。つまり、各テストでチェインを行う必要があります。

答えて

36

まずはモックを静的にしないでください。プライベートフィールドにする。ちょうどあなたのsetUpクラスを@Beforeに入れてください。@BeforeClassではありません。それは束になるかもしれないが、それは安い。

第2に、現在の方法は、モックをテストによって異なるものに戻す正しい方法です。

341

Stub Consecutive Calls(#10 in 2.8.9 api)とすることもできます。この場合、を複数回使用し、コールを返すか、を1つ返し、複数のパラメータ(varargs)を使用してコールを返します。

(スパイを使用して誰のための
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 
    } 
} 
+6

ニース。それを知らなかった。 – OliverS

+1

これは私の質問を解決しました、おかげでトニー! – seanhodges

+140

私はあなたが.return()がvarargsを取るので、コードを短縮することができるという事実を利用することもできると思います:when(mockFoo.someMethod())。thenReturn(0、1、-1); –

0

)とdoReturn()の代わりに()メソッドの:あなたは別の通話に別のオブジェクトを返すために必要なもの

はこれです:

doReturn(obj1).doReturn(obj2).when(this.client).someMethod(); 
関連する問題