Кратко ръководство за @DirtiesContext

1. Общ преглед

В този бърз урок ще научим за анотацията @DirtiesContext . Ще покажем и стандартен начин за използване на анотацията за тестване.

2. @DirtiesContext

@DirtiesContext е пробна пробна тестова анотация . Това показва, че свързаният тест или клас променя ApplicationContext . Той казва на рамката за тестване да затвори и пресъздаде контекста за по-късни тестове.

Можем да анотираме тестов метод или цял клас. Чрез определянето на MethodMode или ClassMode , можем да контролираме, когато Пролет марка контекста за закриване .

Ако поставим @DirtiesContext върху клас, анотацията се прилага за всеки метод в класа с дадения ClassMode.

3. Тестване без изчистване на пролетния контекст

Да приемем, че имаме Потребител :

public class User { String firstName; String lastName; }

Имаме и много прост UserCache:

@Component public class UserCache { @Getter private Set 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.