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を使用する

次に、デフォルトの MethodMode AFTER_METHOD@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");
}

完全なテストクラスを実行すると、addJohnDoeAndPrintCacheprintCacheAgainの間にSpringコンテキストがリロードされます。 したがって、キャッシュが再初期化され、出力は空になります。

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から入手できます。