@ExtendWithは、JUnit 5(Jupiter)で使用されるアノテーションで、テストに拡張機能(Extension)を追加するために使われます。このアノテーションを使用することで、JUnitのテストの実行にカスタマイズされた動作を加えることができます。
基本的な役割
@ExtendWithは、指定したクラス(エクステンションクラス)をJUnitに登録し、テストの実行時にそのクラスが提供するカスタムロジックを適用します。エクステンションを使うと、テストのライフサイクルにフックしたり、追加の設定や処理を行うことができます。
使用例
- エクステンションの登録
以下は、JUnitの拡張機能を利用する基本的な例です。
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.Test;
@ExtendWith(MyExtension.class) // 拡張クラスを登録
public class MyTest {
@Test
void testExample() {
System.out.println("Running test...");
}
}
ここでは、MyExtensionという拡張クラスがテストの実行時に適用されます。
- エクステンションクラスの実装
エクステンションクラスは、org.junit.jupiter.api.extension.Extensionインターフェースを実装する必要があります。以下は簡単な例です。
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
public class MyExtension implements BeforeTestExecutionCallback {
@Override
public void beforeTestExecution(ExtensionContext context) throws Exception {
System.out.println("Before executing test: " + context.getDisplayName());
}
}
このエクステンションでは、テストが実行される前に何らかの処理(この場合はログ出力)を行います。
@ExtendWithがよく使われるケース
- Mockや依存性注入のサポート
- 例えば、MockitoExtensionを使ってMockitoのモックオブジェクトをテストに注入します。
@ExtendWith(MockitoExtension.class)
public class MyTest {
@Mock
private MyService service;
@Test
void testMock() {
// モックを使用したテスト
}
}
- カスタムコンテキストの提供
- Spring Bootのテストでは、@ExtendWith(SpringExtension.class)が使用され、Springのアプリケーションコンテキストを初期化します。
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class MySpringTest {
@Test
void testWithSpring() {
// Springコンテキストを使用したテスト
}
}
- ログやトレースの追加
- テストのライフサイクルにフックして、ログやトレースを追加することができます。
- テスト環境のセットアップ
- 外部リソースの準備やクリーンアップを行うための拡張。
JUnit 4との違い
JUnit 4では、拡張機能は@RunWithアノテーションを使って指定していました。JUnit 5では、@ExtendWithを使用することで、より柔軟な拡張が可能になりました。
まとめ
@ExtendWithはJUnit 5のテスト実行をカスタマイズするためのアノテーションで、以下のような用途に使えます:
- テストライフサイクルにフックしてカスタム処理を追加
- 依存性注入や外部リソースのセットアップ
- テスト環境のカスタマイズ
具体的なエクステンションクラスの内容によって、その機能や目的が変わりますので、テストコードの上に指定されたクラス(例: MyExtension)の内容を確認すると、何を実現しているのかが分かります。