Junit-Test-Protokoll-Anweisungen
Ich habe ein java-8-app mit einer Klasse foo wie diese:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Foo {
private final Logger log = LoggerFactory.getLogger(Foo.class);
public String something() {
log.info("doing foo test");
return "test";
}
}
Dem ich Schreibe eine JUnit (Junit 4.11) test case wie diesem:
public class FooTest {
private Foo foo;
@Before
public void setUp() throws Exception {
foo = new Foo();
}
@Test
public void testSomething() {
String result = foo.something();
assertEquals(result,"test");
}
}
Mein Ziel ist es, einen test schreiben Fall, dass die tests die something
Methode für Sie die return-Wert UND der logging-Anweisung verwendet, um sicherzustellen, dass etwas protokolliert wird. Ich habe Stunden damit verbracht scheuern im web, um herauszufinden, wie, um das setup der junit-test der logging-Anweisung verwendet. Ich habe versucht diese, diese, diese und diese Methode ohne Erfolg.
Ich weiß nicht, ob es etwas, was ich falsch mache oder was. Aber hier ist mein code basiert auf dem letzten Beispiel:
public class FooTest {
private Foo foo;
@Mock private Appender appender;
@Captor private ArgumentCaptor captor;
@Before
public void setUp() throws Exception {
foo = new Foo();
MockitoAnnotations.initMocks(this);
Logger.getRootLogger().addAppender(appender);
}
@After
public void tearDown() throws Exception {
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void testSomething() {
String result = foo.something();
assertEquals(result,"test");
verify(appender).doAppend(((LoggingEvent) captor.capture()));
LoggingEvent loggingEvent = (LoggingEvent) captor.getValue();
assertEquals(loggingEvent.getRenderedMessage(), "doing foo test");
}
}
Aber wenn ich diesen starte bekomme ich folgende Fehlermeldung:
Wanted but not invoked:
appender.doAppend(<Capturing argument>);
-> at <package>.testSomething(FooTest.java:22)
Actually, there were zero interactions with this mock.
Gibt es ein einfacher Weg das zu erreichen, was ich will? Wenn dies der beste Weg ist dann, was mache ich falsch?
- Hinweis. Ihr problem ist die neue - Anweisung, die stellen in Ihrem code. Man könnte hier stackoverflow.com/questions/38863913/... um zu verstehen, wie, um loszuwerden, Aufrufe statischer Methoden oder neue, in Ihrem Fall. Und: um zu verstehen, warum die neue gibt Probleme, möchten Sie vielleicht ein paar videos angesehen: youtube.com/playlist?list=PLD0011D00849E1B79 ... ernsthaft: jede minute, die Ihre Zeit Wert ist.
- Foo hat-logger, der ist nicht geschrieben oder implementiert diese Weise können Sie testen Sie Ihre logger. Sie einfach aufrufen neue Foo, wo foo hat seinen eigenen logger an diesem Punkt ab
- Mögliche Duplikate von Wie man eine JUnit-assert auf eine Nachricht in einem logger
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher!
Appender
Klasseclear()
es bei jedem test@Begin
In der Tat, SLF4J hat bereits eine Umsetzung von dem, was man sich anschauen kann.