2016-07-15 4 views
0

をあざけるとき、私は、このメソッドをテストしたい:無効マッチャー

public void some_method(SomeFactory someFactory) { 
     A a = someFactory.populateWithParameter(parameter1, parameter2, parameter3, parameter4); 
     a.method_call(); 
     .... 
    } 

工場はこのよう

public class SomeFactory(){ 

// some constructor 
public A populateWithParameter(SomeClass1 someClass1, SomeClass2 someClass2, String string, int parameter){ 
return new A(someClass1, someClass2, string, parameter) 
} 
} 

を行くと、テストは、私はこのメッセージ

を取得

public void testSomeMethod() throws Exception { 
     SomeFactory someFactory = mock(SomeFactory.class); 
     when(someFactory.populateWithParameter(
       any(SomeClass1.class), any(SomeClass2.class), 
      anyString(), anyInt())).thenReturn(notNull()); 

     mainActivity.some_method(someFactory); 
... 
    } 

です

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
4 matchers expected, 1 recorded: 
+1

おそらく問題は、あなたがthenReturn(notNull())で正規表現を返そうとしているためです。 A(または嘲笑されたバージョン)のインスタンスを返してみることができますか? http://stackoverflow.com/a/26418391/6526330 –

+0

@ Dr.Nitpick私は既にインスタンスを返そうとしましたが、動作しません! – user1611830

+0

うまくいかないと言うと、実際には何が起こるのですか? – jbarat

答えて

0

戻り値としてnotNull()を使用することはできません。 Mockitoマッチャーは、whenverifyの呼び出しでのみ引数に使用でき、戻り値としては機能しません。具体的には、notNull()は実際にを返します。を返し、隠されたスタックの副作用として「not null」のマッチをマークします。次に、モックと対話するまで(実際にはsome_methodを呼び出すまで)続きます。あなたはInvalidUseOfMatchersExceptionのためのあなたのスタックトレースが表示されませんでしたけど

、私はあなたがpopulateWithParameterスタブないとき、some_method経由populateWithParameterを呼び出すときにエラーが実際に発生したことを賭けます。 「1記録された」マッチャーはnotNull()であり、「4マッチャーが期待される」とは、メソッド呼び出しの引数の数を指す。エラーメッセージは、よくある間違いであるpopulateWithParameter(any(), any(), anyString(), 42)のようないくつかの引数に対して正規表現を使用することを忘れた場合に実際に調整されています。

コメントで「動作しません」と表示されていますがインスタンスを返そうとすると、notNull()を返しても問題は発生しますが、インスタンスを返すとという異なるという問題が発生することがあります。インスタンスを返すように切り替えた後、完全なスタックトレースで質問を更新したり、新しい質問をしたりすることができます。

舞台裏のMockitoマッチャーの詳細については、my question/answer hereを参照してください。

関連する問題