知識庫 / Spring RSS 訂閱

快速指南:@DirtiesContext

Spring,Testing
HongKong
4
01:09 PM · Dec 06 ,2025

1. 概述

在本快速教程中,我們將學習關於 `@DirtiesContext 註解的知識。 我們還將演示使用該註解的標準方式,用於測試。

2. <em @DirtiesContext>

@DirtiesContext 是一個 Spring 測試註解。它指示相關的測試或類修改 ApplicationContext。它告訴測試框架在後續測試中關閉並重新創建上下文。

我們可以對測試方法或整個類進行標註。通過設置 MethodModeClassMode我們可以控制 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 容器在 addJohnDoeAndPrintCacheprintCacheAgain 之間重新加載。因此,緩存重新初始化,輸出為空:

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 測試註解。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.