2015-10-22 13 views
5

私は非常に奇妙な問題に直面しています。あいまいなMockito - 0マッチャーが予想され、1が記録されました(InvalidUseOfMatchersException)

URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
eq(this.config.apiEndpoint() + URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

たりと

URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
contains(this.config.apiEndpoint() + URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

含まれている私はRAW表現を使用しない場合でも、私に

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

This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 

を与えます。
私はメソッドが含まれている変更不思議な場合:

エンドポイントを省略
URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
contains(URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

、それが動作します。

コンフィグとRestHelperが両方嘲笑されています

this.restHelperMock = mock(RESTHelper.class); 
this.config = mock(MyBMWConfiguration.class); 

when(this.config.apiEndpoint()).thenReturn("http://host:port/api"); 

ApiEndpointとURLは、私はモックたかったに等しい、 それが原因で偽の、私はNullPointerExceptionが得るべきである、ではないでしょう場合でも、嘲笑する しかし、私はここには理想がない。

ありがとうございました。

+0

'hamcrest 'でも' Mockito'の 'contains'と' eq'の両方がありますか? –

+0

私は、 'eq(...)'の呼び出しの間に擬似メソッド( 'this.config.apiEndpoint()')を呼び出している可能性があると思います。モックイトを混乱させるかもしれない別のモックをそこで呼び出すのではなく、完全なURL(http:// host:port/api/my/specific/url /)を単純に入れてみてください。モックの内部状態に依存しているので、 –

+0

@ FlorianSchaetzさん、ありがとう、それは解決策でした。私はこれが起こるとは思わなかった。あなたはanwserを書いてください、私はそれを受け入れることができますか? –

答えて

4

eq (...)の呼び出し中に、嘲笑されたメソッドthis.config.apiEndpoint()が呼び出されているようです。他のモックを呼び出すのではなく、そこに完全なURL(host:port/api/my/specific/url)を入れてみてください。モックイトを混乱させる可能性があります。

かなり正直に言うと、私はこれがなぜ起こるか私が説明できるということに深いMockitoにはないが、私はおそらく一日、それに;-)

編集デバッグしようとするでしょう:不思議なことに、私は思えますよりシンプルなテストケースでそれを再現できないようにします。目を満たすよりもここにいるようです。

+1

ええと、私はこれがどうして起こるか完全に見ることができます。 'when'が呼び出された時から最初のマッチャーが呼び出されたときから、他のモックとやりとりしたくないのです。これは、マッチャーを使用すると、組み立てられたマッチャー呼び出しの内部スタック全体が存在するためです。よく目撃されたフロリアン。これを修正するには 'this.config.apiEndpoint()'を 'when'という行の前のそれ自身の行に置くことができます。 –

関連する問題