1. 概述
在本快速教程中,我們將學習關於 `@DirtiesContext 註解的知識。 我們還將演示使用該註解的標準方式,用於測試。
2. <em @DirtiesContext>
@DirtiesContext 是一個 Spring 測試註解。它指示相關的測試或類修改 ApplicationContext。它告訴測試框架在後續測試中關閉並重新創建上下文。
我們可以對測試方法或整個類進行標註。通過設置 MethodMode 或 ClassMode,我們可以控制 Spring 標記上下文進行關閉。
如果我們在一個類上放置 ,該註解將應用於該類中的所有具有指定 ClassMode 的方法。
3. 測試時無需清除 Spring 容器
假設我們有一個 User。
public class User {
String firstName;
String lastName;
}我們還提供一個非常簡單的 用户緩存:。
@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。這意味着 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. 方法級別
方法模式選項為單個方法定義了上下文何時重置:
- BEFORE_METHOD:在當前測試方法之前
- AFTER_METHOD:在當前測試方法之後
6. 結論
在本文中,我們介紹了 @DirtiesContext 測試註解。