2016-09-20 3 views
4

Ich versuche zu bestätigen, dass die korrekte Nachricht von meinem Code in einem Fehlerzustand protokolliert wird, also habe ich org.apache.commons.logging.Log verspottet und ich versuche zu überprüfen, dass es korrekt aufgerufen wird.Wie man Mockito-Argumente mit Methodensignatur vergleicht

Die Signatur der Methode, die ich überprüfen möchte, ist: error(Object, Throwable) Ich erwarte eine Zeichenfolge übergeben, die eine Vielzahl anderer Dinge enthält, enthält aber den Text "Nachricht ist zu groß für die Warteschlange". In diesem Fall ist der Wert throwable null.

Hier ist mein Code, um diese zu überprüfen:

Mockito.verify(errorLog, Mockito.atLeastOnce()).error(
    Mockito.matches("*Message is too big for queue*"), 
    Mockito.isNull(Throwable.class)); 

Wenn diese laufen, bekomme ich einen Fehler aber:

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

Es scheint, dass das Problem hier ist, dass die Mockito.matches() es aussehen läßt für eine Methode mit der Signatur (String, Throwable), wenn die eigentliche Signatur (Object, Throwable) ist.

Wie kann ich diese zusammenbringen? Ich kenne die String ist das Problem, denn wenn ich die Mockito.matches() durch Mockito.any() ersetze es passiert.

+0

Was würde passieren, wenn Sie die führende entfernt und Hinter Sterne von Ihrem Argument zu Mockito.matches? Ich denke, das könnte die Regex passen lassen. – unigeek

+1

[ArgumentCaptor] (http://site.mockito.org/mockito/docs/current/org/mockito/ArgumentCaptor.html) könnte eine Option in Ihrem Fall sein – Mindaugas

+0

Ich versuchte ArgumentCaptor und es hat nicht geholfen: 'Argument (s) sind anders! Gesucht: log.error ( [email protected], null ); ' – Steve

Antwort

1

Vielleicht würde ein Beispiel hier helfen. Sehen Sie, ob Sie das verstehen können. Es kann etwas gekünstelt sein, aber es sollte ein wenig näher sowieso bekommen ..

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