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)。我看到三个选项:

  • 编写自定义匹配器
  • 使用ArgumentCaptor, 并使用 asserts() 测试消息的属性
  • 根据您实际要验证的字段,在 Message 类中实现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 回答