java – 如何使Mockito参数匹配方法签名

我正在尝试验证我的代码在错误条件下记录了正确的消息,所以我嘲笑了org.apache.commons.logging.Log并且我正在尝试验证它是否被正确调用.

我想要验证的方法的签名是:error(Object,Throwable)我期望传入一个String,其中包含各种其他内容,但包含文本“Message is too big to queue”.在这种情况下,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
);

看来这里的问题是当实际签名是(Object,Throwable)时,Mockito.matches()使它查找带签名(String,Throwable)的方法.

我该怎么做这些比赛?我知道字符串是问题,因为如果我用Mockito.any()替换Mockito.matches(),它就会通过.

最佳答案 也许一个例子会有所帮助.看看你是否能理解这一点.它可能有点做作,但无论如何它应该让你更近一点..

Main.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);
    }
}

MainTest.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));
    }
}
点赞