2016-09-20 38 views
4

我试图验证在错误情况下我的代码记录了正确的消息,所以我嘲笑了org.apache.commons.logging.Log,并试图验证它是否正确调用。如何使Mockito参数匹配方法签名

我期待验证的方法的签名是: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.any()替换Mockito.matches()它会通过。

+0

如果您删除,会发生什么的开头和结尾从你的论点到Mockito.matches的星号?我在想这可能会使正则表达式匹配。 – unigeek

+1

[ArgumentCaptor](http://site.mockito.org/mockito/docs/current/org/mockito/ArgumentCaptor.html)可能是您的案例中的一个选项 – Mindaugas

+0

我尝试了ArgumentCaptor并且没有帮助: 'Argument (s)是不同的!求购: log.error( [email protected], 空 );' – Steve

回答

1

也许一个例子会在这里有所帮助。看看你能否理解这一点。这可能是有点做作,但它应该让你有点接近反正..

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