Java 如何使Mockito参数与方法签名匹配

Java 如何使Mockito参数与方法签名匹配,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我试图验证我的代码是否在错误条件下记录了正确的消息,因此我模拟了org.apache.commons.logging.Log,并试图验证它是否被正确调用 我希望验证的方法的签名是:error(Object,Throwable)我希望传入一个字符串,该字符串包含多种其他内容,但包含文本“Message对于queue来说太大”。在这种情况下,可丢弃项将为空 以下是我的代码来验证这一点: Mockito.verify(errorLog, Mockito.atLeastOnce()).error(

我试图验证我的代码是否在错误条件下记录了正确的消息,因此我模拟了
org.apache.commons.logging.Log
,并试图验证它是否被正确调用

我希望验证的方法的签名是:
error(Object,Throwable)
我希望传入一个字符串,该字符串包含多种其他内容,但包含文本“Message对于queue来说太大”。在这种情况下,可丢弃项将为空

以下是我的代码来验证这一点:

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()
,它将通过。

这里可能有一个示例会有所帮助。看看你是否能理解这一点。这可能有点做作,但无论如何,它应该会让你离得更近一些

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

如果从Mockito.matches的参数中删除前导和尾随星号,会发生什么情况?我想这可能会使正则表达式匹配。在您的案例中可能是一个选项我尝试了ArgumentCaptor,但没有帮助:
参数不同!通缉:log.error(org.mockito)。ArgumentCaptor@7ce3cb8e,空)删除星号的方法相同:
参数不同!需要:log.error(匹配(“消息对于队列太大”),isNull()这里是另一个细节——我完全去掉了匹配器:
Mockito.verify(errorLog,Mockito.atlestonce()).error((Object)“| classunderest |消息对于队列来说太大(size=41)。它永远不会合适,所以丢弃。”,null)即使删除了匹配器,它仍然失败:参数不同!需要:log.error(“| ClassUnderTest |消息对于队列太大(大小=41)。它永远不会适合,因此丢弃。”,null);