1. Обзор
В этом кратком руководстве мы узнаем об аннотации @DirtiesContext
. Мы также покажем стандартный способ использования аннотации для тестирования.
2. @DirtiesContext
@DirtiesContext
— это аннотация для тестирования Spring . Это указывает на то, что связанный тест или класс изменяет ApplicationContext
. Он сообщает среде тестирования закрыть и воссоздать контекст для последующих тестов.
Мы можем аннотировать тестовый метод или весь класс. Установив MethodMode
или ClassMode
, мы можем контролировать, когда Spring помечает контекст для закрытия .
Если мы поместим @DirtiesContext
в класс, аннотация будет применяться к каждому методу в классе с заданным ClassMode.
3. Тестирование без очистки контекста Spring
Допустим, у нас есть Пользователь
:
public class User {
String firstName;
String lastName;
}
Также у нас есть очень простой UserCache:
@Component
public class UserCache {
@Getter
private Set<String> userList = new HashSet<>();
public boolean addUser(String user) {
return userList.add(user);
}
public void printUserList(String message) {
System.out.println(message + ": " + userList);
}
}
Мы создаем интеграционный тест для загрузки и тестирования полного приложения:
@TestMethodOrder(OrderAnnotation.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SpringDataRestApplication.class)
class DirtiesContextIntegrationTest {
@Autowired
protected UserCache userCache;
...
}
Первый метод, addJaneDoeAndPrintCache
, добавляет запись в кеш:
@Test
@Order(1)
void addJaneDoeAndPrintCache() {
userCache.addUser("Jane Doe");
userCache.printUserList("addJaneDoeAndPrintCache");
}
После добавления пользователя в кеш выводит содержимое кеша:
addJaneDoeAndPrintCache: [Jane Doe]
Затем printCache снова
печатает пользовательский кеш:
@Test
@Order(2)
void printCache() {
userCache.printUserList("printCache");
}
Он содержит имя, добавленное в предыдущем тесте:
printCache: [Jane Doe]
Допустим, более поздний тест полагался на пустой кеш для некоторых утверждений. Ранее вставленные имена могут вызвать нежелательное поведение.
4. Использование @DirtiesContext
Теперь мы покажем @DirtiesContext
с MethodMode по умолчанию
, AFTER_METHOD
. Это означает, что Spring пометит контекст для закрытия после завершения соответствующего метода тестирования. ``
Чтобы изолировать изменения в тесте, мы добавляем @DirtiesContext
. Давайте посмотрим, как это работает.
Тестовый метод addJohnDoeAndPrintCache
добавляет пользователя в кеш. Мы также добавили аннотацию @DirtiesContext
, в которой говорится, что контекст должен закрываться в конце тестового метода:
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
@Test
@Order(3)
void addJohnDoeAndPrintCache() {
userCache.addUser("John Doe");
userCache.printUserList("addJohnDoeAndPrintCache");
}
Вывод сейчас:
addJohnDoeAndPrintCache: [John Doe, Jane Doe]
Наконец, printCacheAgain снова
печатает кеш:
@Test
@Order(4)
void printCacheAgain() {
userCache.printUserList("printCacheAgain");
}
Запустив полный тестовый класс, мы видим перезагрузку контекста Spring между addJohnDoeAndPrintCache
и printCacheAgain
. Таким образом, кеш повторно инициализируется, и вывод пуст:
printCacheAgain: []
5. Другие поддерживаемые этапы тестирования
В приведенном выше примере показана фаза после текущего метода тестирования . Давайте сделаем краткий обзор этапов:
5.1. Уровень класса
Параметры ClassMode
для тестового класса определяют, когда контекст сбрасывается :
BEFORE_CLASS:
перед текущим тестовым классомBEFORE_EACH_TEST_METHOD:
перед каждым тестовым методом в текущем тестовом классе.AFTER_EACH_TEST_METHOD:
после каждого тестового метода в текущем тестовом классеAFTER_CLASS:
после текущего тестового класса
5.2. Уровень метода
Параметры MethodMode
для отдельного метода определяют, когда контекст сбрасывается :
BEFORE_METHOD:
Перед текущим методом тестированияAFTER_METHOD
: после текущего метода тестирования
6. Заключение
В этой статье мы представили аннотацию тестирования @DirtiesContext .
Как всегда, код примера доступен на GitHub .