我有以下代码
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)
有人能指点我如何正确地编写测试吗?
答案 0 :(得分:6)
你不能这样做:eq()只能用于模拟的方法参数,而不能用在其他对象中(就像你在Message
的构造函数中所做的那样)。
我看到三个选项:
ArgumentCaptor
,并使用asserts()equals()
,以便根据您实际要验证的字段测试与其他Message的相等性。答案 1 :(得分:3)
你不能像这样嵌套匹配器(虽然它会很棒):
eq(new Message(eq(Model.OutgoingMessageTypes.BUTTON_STATUSES_CHANGED)
当您使用eq
时,匹配器只使用equals()
来比较传递给模拟的内容以及您在verify()
中提供的内容。话虽如此,您应该实施equals()
方法来仅比较相关字段或使用自定义匹配器。
根据经验:你应该拥有与参数数量相同数量的匹配器 - 或者0。
答案 2 :(得分: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>);