Перейти к основному содержимому

Краткое руководство по @DirtiesContext

· 3 мин. чтения

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 .