Тесты на технологичность кода обеспечивают несколько отличных аспектов в эффективном дизайне кода, таких как поддерживаемость; они помогают с документацией и облегчают рефакторинг и создание эволюционного дизайна/архитектуры. Об этом не может быть и речи, но какой хороший тестовый стек выбрать для начала проекта? В этом видео объясняется минимальный тестовый стек для начала вашего проекта на Java.
Первое, что нужно понимать, когда мы говорим о минимальном, это то, что нет серебряной пули для тестового стека. В конце концов, нам нужно включать или удалять зависимости, особенно когда речь идет о устаревшем коде. Учитывая это, я расскажу о моем любимом тестовом стеке на Java, который я использую и рекомендую как минимальный для начала с нуля:
-
JUnit-Jupiter: Пятая версия JUnit нарушает совместимость с предыдущей версией; однако это стоит того, поскольку она предлагает множество функций, в основном для создания пользовательских расширений.
-
Mockito: Очень популярный фреймворк для моков на Java. Эта популярность и обширное сообщество позволяют создавать различные расширения, такие как с JUnit-Jupiter.
-
AssertJ: Если вам нравятся прозрачные API, как мне, тогда AssertJ является необычным библиотекой для вас.
Используя проект maven, вы можете добавить зависимости этих библиотек:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.verson}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.verson}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.verson}</version>
<scope>test</scope>
</dependency>
Рассмотрим контекст футбольного чемпионата, где у нас есть команда, которая должна состоять из одиннадцати игроков, и имена каждого из них должны быть уникальными в чемпионате. Мы можем исследовать тесты на это.
Начиная с JMockito и теста, нам нужно протестировать сервис, где нам нужно проверить, существует ли имя в базе данных для выполнения логики. В этот момент нам это не нужно и мы не хотим создавать интеграционный тест.
Мы хотим сосредоточиться на бизнесе, поэтому не хотим тестировать базу данных или фреймворк, а только мой код. Таким образом, мы будем мокать репозиторий в двух сценариях, когда есть имя и когда его нет.
Используя Mockito интеграцию с JUnit-Jupiter, вы можете внедрять моки только с использованием аннотаций. Ниже приведен код теста с использованием JMockito, где нам не нужно иметь базу данных или выходить за рамки фокуса для тестирования бизнеса.
@ExtendWith(MockitoExtension.class)
class ChampionshipServiceTest {
@Mock
private ChampionRepository repository;
@InjectMocks
private ChampionshipService service;
@Test
public void shouldRegister() {
Mockito.when(repository.existByName("Bahia")).thenReturn(false);
Team bahia = Team.of("Bahia");
service.register(bahia);
Mockito.verify(repository).existByName("Bahia");
}
@Test
@DisplayName("should return an exception when there is a team with a name")
public void shouldThrownAnExceptionWhenTeamNameExists() {
Mockito.when(repository.existByName("Bahia")).thenReturn(true);
Team bahia = Team.of("Bahia");
Assertions.assertThrows(IllegalArgumentException.class, () ->
service.register(bahia));
Mockito.verify(repository).existByName("Bahia");
}
}
AssertJ облегчает понимание проверок благодаря поддерживаемому библиотекой флоу API. Вы можете тестировать коллекции, карты или отдельные экземпляры. Например, можно проверить добавление игрока в команду с его помощью.
@Test
public void shouldCreatePlayers() {
Team bahia = Team.of("Bahia");
bahia.add(Player.of("Neymar", "Santos", 10));
bahia.add(Player.of("Cristiano Ronaldo", "Lisbon", 10));
org.assertj.core.api.Assertions.assertThat(bahia.players())
.hasSize(2)
.map(Player::name)
.contains("Neymar", "Cristiano Ronaldo");
}
Просмотрите это и больше информации в этом видео.
Итоги:
-
A minimum test stack to start Java
-
Узнайте больше о JUnit и почему это хороший выбор
-
Изучите моки, исследуя с JMockito
-
Сделайте ваши тесты красивыми с помощью флоу-API Assert: AssertJ
Source:
https://dzone.com/articles/creating-your-swiss-army-knife-on-java-test-stack