2017-02-04 17 views
1

私はMockitoを初めて使用しています。模擬メソッドが呼び出されていない - java

上記のコードによれば、mocked.add(6,7)が呼び出されたときに5が出力されますが、add()メソッドが呼び出されず、コードが0を出力します。なぜですか?このコードの任意のソリューションですか?

import org.mockito.Mockito; 

    import static org.mockito.Mockito.*; 


    class Calc{ 

     int add(int a,int b){ 
     System.out.println("add method called"); 
     return a+b; 
    } 

}

 class MockTest{ 
      public static void main(String[] args) { 
      Calc mocked=mock(Calc.class); 
      when(mocked.add(2,3)).thenReturn(5); 
      System.out.println(mocked.add(6,7)); 
     } 
     } 
+1

であなたの質問は私には意味がないことを行うことができます。あなたは明示的に「引数が2と3のときに5を返し、次に6と7を渡すとき、mockitoに言う...なぜ前提条件が満たされていない場合、そのルールを適用するべきですか? – Tom

答えて

1

5の結果を得るために、あなたがwhen..thenを設定するときとまったくのparamsを渡す必要があります。それ以外の場合はmockito整数0である(「デフォルト」値を返します:

モックがデフォルトで返すんどの値

すべてMockitoが素敵 デフォルトの戻り」によってあざけり透明で目立たないようにするために? 「値の例:デフォルトで返されているものの値を正確に を見るためにスタブについてのJavadocを参照してくださいゼロ、falseys、空 コレクションやヌル

をあなたがして、任意の整数のための5を返したい使用している場合。。。:

when(mocked.add(Mockito.any(Integer.class),Mockito.any(Integer.class))).thenReturn(5); 
0

"モック"は、実際のオブジェクトの動作をシミュレートする空のダミーオブジェクトです。 when(mocked.add(2,3)).thenReturn(5);のような振る舞いを定義した場合は、正確な値を受け取ったときに何をすべきかを具体的に指示します。

mocked.add(6,7)は、その時点での動作を定義していないため、デフォルト値を使用しているため、この時点で0が返されます。したがって、可能なすべての入力をカバーする場合は、ソリューション@MaciejKowalskiを投稿し、Mockito.any(Integer.class)のような汎用マッチャーを使用してください。

まだ私はモックを正しく扱う方法が明確ではないと思います。モックは、依存関係ツリー全体を設定する必要なしに、被テストシステムに外部依存関係を提供する方法です。そのクラス内の実際のメソッドは通常呼ばれません。これは、when(mocked.add(2,3)).thenReturn(5);のようなものです。それはのモックに実際にそれを持っていない実際の依存関係のようにのように振る舞います。

の例では、次のようになります。

public class TestClass { 
    private ExternalDependency dep; 
    public void setDep(ExternalDependency dep) { 
     this.dep = dep; 
    } 
    public int calculate() { 
     return 5 + dep.doStuff(); 
    } 
} 

public class ExternalDependency { 
    public int doStuff() { 
     return 3; 
    } 
} 

今、あなたのテストコードに次のようなモックを使用することができます。

@Test 
public void should_use_external_dependency() { 
    // Aquire a mocked object of the class 
    ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class); 
    // Define its behaviour 
    Mockito.when(mockedDep.doStuff()).thenReturn(20); 

    TestClass sut = new TestClass(); 
    sut.setDep(mockedDep); 

    // should return 25, since we've defined the mocks behaviour to return 20 
    Assert.assertEquals(25, sut.calculate()); 
} 

sut.calculate()が呼び出された場合は、ExternalDependencyにおける方法が本当にすべきではありませんそれは呼び出されたスタブオブジェクトに代わって委任されます。あなたは本当クラスの本当メソッドを呼び出したい場合しかし、あなたはMockito.spy(ExternalDependency.class)に代わりスパイを使用することができます。また、when(mockedDep.doStuff()).thenCallRealMethod();

関連する問題