2016-06-29 9 views
1

Ich versuche herauszufinden, wie man eine in meiner LoggingRestService-Klasse geschriebene Methode testet. Ich möchte überprüfen, ob meine (externe) Fehlermethode den korrekten Protokolleintrag in diesem Logger erzeugt.Wie würde ich die Anmeldung in meiner Anwendung testen? Neu in Mockito und Testsuchrichtung

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingRestService.class); 

@POST 
@Path("debug") 
@ApiOperation(value = "Writes js error message log. (not secured)") 
@ApiResponse(code = 200, message = "Message logged") 
public void getUserList(@ApiParam(value = "Js debug message.") 
           String message) { 
    ConverterUtils.error(LOGGER, message, null); 
} 

}

Hier ist ConverterUtils Error-Methode:

public static void error(Logger logger, String mess, Exception ex) { 
    Class<?> aClass = logger.getClass(); 
    try { 
     Method method = aClass.getMethod("error", String.class, Throwable.class); 
     method.invoke(logger, mess, ex); 
    } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { 
     LOGGER.error("get logger error", e); 
    } 
} 

Ich habe Mockito nie benutzt, aber ich bin ein wenig vertraut mit dem Konzept der spöttischen classes..still bin ich ein wenig verblüfft. Mir wurde nicht viel Richtung zum Testen gegeben, und der Versuch, unabhängig zu sein, verrottet langsam mein Selbstvertrauen. Vielen Dank.

+0

siehe http://stackoverflow.com/questions/30703149/mock-private-static-final-field-using-mockito-o-jmockit – paulk23

+0

Schön zu sehen jemand Protokollierung zu testen. Ich habe (auf und ab) eine Bibliothek geschrieben, um beim Testen der Protokollierung zu helfen, die teilweise auf dieser http://bloodredsun.com/2010/12/09/checking-logging-in-unit-tests/ basiert. Es ist eine nette Beschreibung von wie man die Protokollierung testet. Vielleicht würde es helfen. (Blick auf Google, gibt es mehrere Artikel zum Testen der Protokollierung) – Gavin

Antwort

1

Lassen Sie mich überprüfen, ob ich das erhalte, was Sie sagen: Sie möchten überprüfen, dass Ihre ConverterUtil-Klasse die Fehlermethode mit der entsprechenden Meldung und Ausnahme aufruft.

Um dies tun zu können, müssen Sie sicherstellen, dass Ihre ConverterUtils-Klasse mit einer falschen Version eines Loggers aufgerufen wird. Das kannst du mit mock machen (Logger.class). Das funktioniert auch, wenn Logger eine Klasse und keine Schnittstelle ist, weil Mockito Klassen vorspielen kann, die nicht endgültig sind. Es wird tatsächlich eine Unterklasse für Sie erstellen.

Ihr Test-Code aussehen wird:

Logger mockedLogger = mock(Logger.class); 
String expectedMessage = "Whatever"; 
Exception expectedException = new Exception(); 

// Business method 
ConverterUtils.error(mockedLogger, expectedMessage, expectedException); 

// Asserts 
verify(mockedLogger).error(expectedMessage, expectedException); 

Auf einer Seite Knoten: es mir ein Rätsel, warum die Error-Methode ist nicht so einfach wie:

public static void error(Logger logger, String mess, Exception ex) { 
    logger.error(mess, ex); 
} 

Ich verstehe wirklich nicht, warum Sie muss hier die Reflexionsschicht verwenden. Sie wissen genau, welche Methode Sie wollen, also warum rufen Sie nicht einfach die Methode auf, wie sie ist.