我有考试
Document document = spy(new Document());
Whitebox.setInternalState(documentReceiverInteractor, "document", document);
String text= "string";
Whitebox.invokeMethod(documentReceiverInteractor, "saveFields", anyString(), eq(text), anyString(),
anyString(), anyString(), anyString(), anyString());
verify(document).setText(text);
启动后,我得到这个错误:
Argument(s) are different! Wanted:
document.setText(
<any string>
);
-> at ru.psbank.msb.dev.business.document.edit.receiver.DocumentReceiverInteractorTest.saveFields(DocumentReceiverInteractorTest.java:98)
Actual invocation has different arguments:
document.setText(
null
);
eq
可以很好地处理基元并且没有对象。我应该怎么办?
最佳答案
Whitebox.invokeMethod(documentReceiverInteractor, "saveFields",
anyString(), eq(text), anyString(),
anyString(), anyString(), anyString(), anyString());
这个说法没有道理。对 anyString()
等的调用是 Mockito 的信号,只有在对 when
和 verify< 的调用中才有意义
。它们的返回值为 null
、0
、""
或其他虚拟值,以及 their side effects are to modify Mockito's internal state ;它们不是用于测试的随机或任意值,并且对白盒没有任何特殊行为。
(在后台,您使用 eq(text)
的返回值调用 setText
,它是 null
,并匹配它针对您不小心添加到参数匹配器堆栈的 anyString()
调用之一。)
相反,选择特定值:
Whitebox.invokeMethod(documentReceiverInteractor, "saveFields",
"string 1",
text,
"string 2",
"string 3",
"string 4",
"string 5",
"string 6");
...而不是使用 Whitebox ,它在 Mockito 的 internal
包 org.mockito.internal.util.reflection
中并且是 deleted in Mockito 2.2 ,您应该考虑使方法调用更加可见(如果您的测试在同一个包中,则为包私有(private),否则为公共(public))。毕竟,您的测试是您类(class)的消费者。如果您选择走那条路,请考虑添加 @VisibleForTesting
或其他一些文档(如 /** Visible for testing. */
)。
关于android - 带有 eq ("string"的白盒 invokeMethod ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830214/