Как разработчику Java, нам нужно охватить множество сценариев, чтобы гарантировать качество нашего программного обеспечения и как можно скорее выявить ошибки при внедрении нового кода. Для 99% всех моих случаев использования AssertJ, Junit, Mockito и Wiremock достаточно, чтобы охватить тестовые случаи. Но для других случаев использования, таких как информация о модульном тестировании, сообщения отладки или предупреждения, эти фреймворки вам не помогут. Нет также никакой другой структуры, которая может предоставить простой в использовании метод для захвата сообщений журнала.
Ответ, предоставленный сообществом, работает хорошо, но это много стандартного кода, чтобы просто утверждать события вашего журнала. Даже я столкнулся с той же проблемой, и поэтому хотел облегчить для себя и поделиться этим с вами! Так появилась библиотека LogCaptor.
Вам также может понравиться: Полная коллекция модульных тестов [Учебники и рамки]
Включите следующую зависимость в свой проект в качестве тестовой зависимости:
Джава
1
<dependency>
2
<groupId>io.github.hakky54</groupId>
3
<artifactId>logcaptor</artifactId>
4
<version>1.0.1</version>
5
<scope>test</scope>
6
</dependency>
Предположим, у вас есть следующий сервис, который создает журналы:
Джава
xxxxxxxxxx
1
import org.apache.logging.log4j.LogManager;
2
import org.apache.logging.log4j.Logger;
3
public class FooService {
5
private static final Logger LOGGER = LogManager.getLogger(FooService.class);
7
public void sayHello() {
9
LOGGER.info("Keyboard not responding. Press any key to continue...");
10
LOGGER.warn("Congratulations, you are pregnant!");
11
}
12
}
И давайте создадим модульный тест для этого сервиса, чтобы утверждать сообщения журнала и даже уровни журнала
Джава
xxxxxxxxxx
1
import static org.assertj.core.api.Assertions.assertThat;
2
import org.junit.Test;
3
public class FooServiceShould {
5
7
public void logInfoAndWarnMessages() {
8
String expectedInfoMessage = "Keyboard not responding. Press any key to continue...";
9
String expectedWarnMessage = "Congratulations, you are pregnant!";
10
LogCaptor<FooService> logCaptor = LogCaptor.forClass(FooService.class);
12
FooService fooService = new FooService();
14
fooService.sayHello();
15
assertThat(logCaptor.getLogs("info").containsExactly(expectedInfoMessage);
17
assertThat(logCaptor.getLogs("warn").containsExactly(expectedWarnMessage);
18
}
19
}
Вы также можете получить все сообщения журнала, отбросив уровень журнала:
Джава
xxxxxxxxxx
1
import static org.assertj.core.api.Assertions.assertThat;
2
import org.junit.Test;
3
public class FooServiceShould {
5
7
public void logInfoAndWarnMessages() {
8
String expectedInfoMessage = "Keyboard not responding. Press any key to continue...";
9
String expectedWarnMessage = "Congratulations, you are pregnant!";
10
LogCaptor<FooService> logCaptor = LogCaptor.forClass(FooService.class);
12
FooService fooService = new FooService();
14
fooService.sayHello();
15
assertThat(logCaptor.getLogs())
17
.hasSize(2)
18
.containsExactly(expectedInfoMessage, expectedWarnMessage);
19
}
20
}
Вы также можете получить конкретные сообщения журнала с помощью перечисления:
Джава
xxxxxxxxxx
1
import static org.assertj.core.api.Assertions.assertThat;
2
import org.junit.Test;
3
import ch.qos.logback.classic.Level;
4
public class FooServiceShould {
6
8
public void logInfoAndWarnMessages() {
9
String expectedInfoMessage = "Keyboard not responding. Press any key to continue...";
10
String expectedWarnMessage = "Congratulations, you are pregnant!";
11
LogCaptor<FooService> logCaptor = LogCaptor.forClass(FooService.class);
13
FooService fooService = new FooService();
15
fooService.sayHello();
16
assertThat(logCaptor.getLogs(Level.INFO)).containsExactly(expectedInfoMessage);
18
assertThat(logCaptor.getLogs(Level.WARN)).containsExactly(expectedWarnMessage);
19
}
20
}
Исходный код доступен здесь на Github: Github - Log Captor .
Получить последнюю версию от Maven Central .
Он также работает с аннотациями Lombok, такими как Log4j, Log4j2, Slf4j и Log.
Удачи и приятного утверждения ваших сообщений журнала!
Дальнейшее чтение
Руководство по модульному тестированию: что тестировать, а что не тестировать