4

私はこれをしたい:

when(myObject.getEntity(1l,usr.getUserName()).thenReturn(null);
when(myObject.getEntity(1l,Constants.ADMIN)).thenReturn(null);

マッチャーと一列に並んでいます。だから、私はこのコードを持っています:

import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import static org.mockito.AdditionalMatchers.*;

[...]

User usr = mock(usr);

[...]

when(myObject.getEntity(
    eq(1l), 
    or(eq(usr.getUserName()),eq(Constants.ADMIN))
    )
).thenReturn(null);

しかし、Or マッチャーを使用すると、JUnit が失敗します。

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.
    at blah.blah.MyTestClass.setup(MyTestClass:The line where I use the when & or matcher)
... more stacktrace ...

私が間違っていることは何ですか?

ありがとう!

4

1 に答える 1

5

はモックであるためusr、そのインライン メソッド呼び出しusr.getUserName()は、あなたをうんざりさせている部分です。Mockito の実装と構文の巧妙さに特有の理由から、別のメソッドをスタブ化する途中でモック化されたメソッドを呼び出すことはできません。

when(myObject.getEntity(
    eq(1l), 
    or(eq(usr.getUserName()),eq(Constants.ADMIN))
    )
).thenReturn(null);

Mockito マッチャーの呼び出しはeqor実際には 0 や null などのダミー値を返し、副作用として、マッチャーの動作をArgumentMatcherStorageというスタックに追加します。Mockito は、モックでメソッド呼び出しを確認するとすぐに、スタックを調べて、それが空であるかどうか (つまり、すべての引数が等しいかどうかを確認する)、または呼び出されたメソッドのパラメーター リストの長さを確認します (つまり、スタック上のマッチャーを使用します。パラメーターごと)。それ以外はエラーです。

Java の評価順序を考えると、コードeq(1l)は最初のパラメーターを評価し、次にusr.getUserName()2 番目のパラメーター ( の最初のパラメーター) を評価しますorgetUserName引数を取らないことに注意してください。

これはうまくいくはずです:

String userName = usr.getUserName(); // or whatever you stubbed, directly
when(myObject.getEntity(
    eq(1l), 
    or(eq(userName),eq(Constants.ADMIN))
    )
).thenReturn(null);

Mockito マッチャーが内部でどのように機能するかについて詳しくは、他の SO の回答を参照してください

于 2013-10-03T00:55:42.860 に答える