2013-10-17 2 views
6

Ich sehe, dass Logger mit Hilfe von Powermock oder eine Art überschrieben Konstruktor verspottet wurde, die Logger nimmt.Was ist die Strategie, statische Logger in Java-Service mit Mockito Schein

Werden Logger überall im Code verwendet, ist das nicht ihre einfache Art, nur mit Mockito zu arbeiten? Eine Möglichkeit, den Anruf zu ignorieren oder zu verspotten - Ich möchte keine Nachricht validieren, sondern nur die Nullzeiger-Ausnahme vermeiden. Ich bin neu in Sachen Frameworks, also frage ich mich, ob ich Jmockit anstelle von Mischen und Vergleichen von zweien verwenden soll Bibliotheken - Der einzige Grund, jomockit bisher zu vermeiden - es ist einfach zu voll und kann leicht missbraucht werden!

+1

Warum müssen Sie die Logger verspotten? Warum nicht einfach das Logging passieren lassen? Sie können eine Testkonfiguration für die Protokollierung einrichten, die verhindert, dass eine Datei geschrieben wird (z. B. einfach die gesamte Protokollierung an die Konsole senden). –

+0

Hmm, einfach und besser Idee. – cpandey05

Antwort

4

Ich benutze die Überprüfung von Logs in Fällen, in denen ich denke, dass es sehr wichtig ist, auf einem bestimmten Level zu loggen. Dies ist, wie ich es tun mit Mockito:

Utility-Klasse

public final class LoggingTestUtil { 

    private LoggingTestUtil() { 
    } 

    public static void setupLoggingMock(Logger logger, Appender<ILoggingEvent> appender) { 
     logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
     when(appender.getName()).thenReturn("MOCK"); 
     logger.addAppender(appender); 
    } 

    public static void verifyLogAppended(Appender<ILoggingEvent> appender, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getMessage().contains(loggedString); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getLevel().equals(level); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       LoggingEvent event = (LoggingEvent) argument; 
       return event.getLevel().equals(level) && event.getMessage().contains(loggedString); 
      } 
     })); 
    } 
} 

In Testklasse

private static Logger root; 
@Mock 
private static Appender<ILoggingEvent> mockAppender; // used to test that logging occurs 

    @Test 
    public final void testSomething(){ 
     LoggingTestUtil.setupLoggingMocks(root, mockAppender); 
     underTest.doSomethingBad(); 
     LoggingTestUtil.verifyLogAppendedAtLevel(mockAppender, Level.ERROR, "bad thing"); 
    } 
+3

Ich glaube, dass das Spotten eine schlechte Strategie für die Log-Verifikation ist, da es brüchig und übertrieben ist. Ich habe eine JUnit-Regel erstellt, die einen temporären Appender zum Standard-Logger in log4j hinzufügt. Dies ermöglicht dann eine Überprüfung der Protokollierung, indem einfach die Regel zum Test hinzugefügt wird. https://github.com/dancerjohn/LibEx/blob/master/testlibex/src/main/java/org/libex/test/logging/log4j/Log4jCapturer.java –

+0

@JohnB - Interessant ... Wird es auschecken. Ich finde diese Lösung spröde, da sie bricht, wenn sich die Ebene/Saite ändert. Aber wäre eine Regel in dieser Hinsicht nicht genau die gleiche? Mit Overkill meinen Sie, dass die Mocks viel mehr Schwergewicht sein würden? Ich bin relativ neu zu verspotten, so sehr interessiert zu wissen. :) – Dennis

+0

1. Ja, die Mocks sind viel schwerer und die erwarteten Methodenaufrufe müssen konfiguriert werden. 2. Der Test würde NUR fehlschlagen, wenn die Protokollierungsstufe Teil der Verifizierung war. Wenn Sie eine FEHLER-Nachricht erwarten und es eine INFO war, wird es fehlschlagen. Wenn Sie eine Nachricht auf einer beliebigen Ebene erwarten, würde sie nicht fehlschlagen. –

Verwandte Themen