web-dev-qa-db-fra.com

Instructions de journal de test Junit

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?

9
Richard

Sûr!

  • Créez votre propre classe Singleton Appender personnalisée en mémoire
  • Modifiez la configuration de l'enregistreur de test pour vous connecter à cet appender en plus de toute autre journalisation que vous ferez
  • clear() lors de chaque test @Begin
  • affirmez-le normalement avant la fin du test.

En fait, SLF4J a déjà ne implémentation de cela que vous pouvez regarder.

7
Tassos Bassoukos