我正在尝试验证我的代码在错误情况下是否记录了正确的消息,所以我模拟了 org.apache.commons.logging.Log
并且我正在尝试验证它是否被正确调用。
我要验证的方法的签名是:error(Object, Throwable)
我希望传入一个包含各种其他内容的字符串,但包括文本“消息对于队列来说太大了”。在这种情况下,throwable 将为 null。
这是我验证这一点的代码:
Mockito.verify(errorLog, Mockito.atLeastOnce()).error(
Mockito.matches("*Message is too big for queue*"),
Mockito.isNull(Throwable.class));
当它运行时,我得到一个错误:
Argument(s) are different! Wanted:
log.error(
matches("*Message is too big for queue*"),
isNull()
);
-> at com.company.TestClass.testMessageTooBig(TestClass.java:178)
Actual invocation has different arguments:
log.error(
|ClassUnderTest|Message is too big for queue (size=41). It will never fit, so discarding.,
null
);
这里的问题似乎是 Mockito.matches()
使其在实际签名为 (Object,Throwable) 时寻找具有签名 (String, Throwable) 的方法。
我怎样才能使这些匹配?我知道字符串是问题所在,因为如果我将 Mockito.matches()
替换为 Mockito.any()
它就会通过。
最佳答案
也许这里有一个例子会有所帮助。看看你是否能理解这一点。它可能有点做作,但无论如何它应该让你更接近..
主.java
package com.company;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
private static Log log = LogFactory.getLog(Main.class);
public Main(Log l) {
this.log = l;
}
public static void main(String[] args) {
Main m = new Main(log);
m.go();
}
public void go() {
log.info("this is a test of the emergency broadcasting system.", null);
}
}
主测试.java
package com.company;
import org.apache.commons.logging.Log;
import org.junit.Test;
import org.mockito.Mockito;
import static org.mockito.Matchers.*;
public class MainTest {
Log mockLogger = (Log) Mockito.mock(Log.class);
private Main testSubject = new Main(mockLogger);
@Test
public void should_use_logger() {
//Mockito.doNothing().when(mockLogger).info(anyString(), any());
testSubject.go();
Mockito.verify(mockLogger, Mockito.times(1)).info(contains("emergency broadcasting"), isNull(Throwable.class));
}
}
关于java - 如何使 Mockito 参数匹配方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604187/