Mockito error : org.mockito.exceptions.misusing.InvalidUseOf



我有下面的代码

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)

有人能告诉我如何正确地写测试吗?

您不能这样做:eq()只能用于模拟方法参数,而不能在其他对象中使用(就像您在Message的构造函数中所做的那样)。我看到三个选项:

  • 编写自定义匹配器
  • 使用ArgumentCaptor,并使用asserts()测试消息的属性
  • 在Message类中实现equals(),以便根据实际要验证的字段测试与另一个Message的相等性

你不能像这样嵌套匹配器(尽管这会很棒):

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

当您使用eq时,匹配器只需使用equals()来比较传递给mock的内容和您在verify()中提供的内容。也就是说,您应该实现equals()方法以仅比较相关字段,或者使用自定义匹配器。

根据经验:匹配器的数量应该与参数的数量相同,或者为0。

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>);

相关内容

  • 没有找到相关文章

最新更新