5

私は以下のコードを持っています

public void testInitializeButtons() {
        model.initializeButtons();
        verify(controller, times(1)).sendMessage(
                eq(new Message(eq(Model.OutgoingMessageTypes.BUTTON_STATUSES_CHANGED),
                        eq(new ButtonStatus(anyBoolean(), eq(false), eq(false), eq(false), eq(false))),
                        anyObject())));
    }

次の例外をスローします

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
1 matchers expected, 9 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 se.cambiosys.client.medicalrecords.model.MedicalRecordPanelModelTest.testInitializeButtons(MedicalRecordPanelModelTest.java:88)

誰かがテストを正しく書く方法を教えてもらえますか?

4

3 に答える 3

6

それはできません。eq()はモックされたメソッドパラメーターにのみ使用でき、他のオブジェクトの内部では使用できません(のコンストラクターで使用したようにMessage)。3つのオプションがあります。

  • カスタムマッチャーを書く
  • を使用しArgumentCaptor、asserts()を使用してメッセージのプロパティをテストします
  • equals()実際に検証したいフィールドに基づいて、別のメッセージとの同等性をテストするために、Messageクラスに実装します。
于 2012-07-19T07:10:29.910 に答える
3

このようなマッチャーをネストすることはできません(ただし、すばらしいでしょう)。

eq(new Message(eq(Model.OutgoingMessageTypes.BUTTON_STATUSES_CHANGED)

を使用している場合eq、マッチャーは単にequals()モックに渡されたものとで提供しているものを比較するために使用しますverify()。そうは言っても、equals()関連するフィールドのみを比較するようにメソッドを実装するか、カスタムマッチャーを使用する必要があります。

経験則として、引数の数と同じ数のマッチャー(または0)が必要です。

于 2012-07-19T07:10:12.203 に答える
2

sendMessage内の値は、通常のMessageインスタンスである必要があります。'eq'呼び出しを使用する必要はありません。同様に、ButtonStatusコンストラクター内では、通常のオブジェクトを使用するだけです。おそらく、次のようなものが必要です。

verify(controller, times(1)).sendMessage(
            new Message(Model.OutgoingMessageTypes.BUTTON_STATUSES_CHANGED,
                    new ButtonStatus(false, false, false, false, false),
                    <something else here>);
于 2012-07-19T07:11:03.020 に答える