J'ai une application Java 8 avec une classe foo comme celle-ci:
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";
}
}
Pour lequel j'écris un scénario de test JUnit (Junit 4.11) comme ceci:
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");
}
}
Mon objectif est d'écrire un cas de test qui teste la méthode something
pour sa valeur de retour [~ # ~] et [~ # ~] l'instruction de consignation pour vous assurer que quelque chose est consigné. J'ai passé des heures à parcourir le Web pour découvrir comment configurer le junit pour tester la déclaration de journalisation. J'ai essayé la méthode this , this , this and this en vain.
Je ne sais pas si c'est quelque chose que je fais mal ou quoi. Mais voici mon code basé sur le dernier exemple:
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");
}
}
Mais lorsque j'exécute cela, j'obtiens l'erreur suivante:
Wanted but not invoked:
appender.doAppend(<Capturing argument>);
-> at <package>.testSomething(FooTest.Java:22)
Actually, there were zero interactions with this mock.
Existe-t-il un moyen plus facile d'accomplir ce que je veux? Si c'est la meilleure façon, que fais-je de mal?
Sûr!
Appender
personnalisée en mémoireclear()
lors de chaque test @Begin
En fait, SLF4J a déjà ne implémentation de cela que vous pouvez regarder.