はじめに
TestTemplate
を使おうと思った経緯
日付をinputにして、
outputが日付から算出されているテストがあった。
検証はinputからoutputが期待通り出ているかという点のみだった。
これ、1個のテストメソッドの中に何個も日付のパターン書いていくのスマートじゃなくね?(なんて思ういきった時期もあったのかもしれない…)
調べてみたら、TestTemplate
ってのが見つかったから使ってみた。
TestTemplateでなにができる?
同じテストを異なるコンテキストで実行するための準備処理などを行う。
ここでいう準備処理は、@BeforeEach
@AfterEach
のアノテーションの動きのこと。
これをテスト実施前に変更して、異なる前提条件でテストメソッドを実行できるという機能!
どうやって使うの?
実装クラス
// TestTemplateInvocationContextProvider を実装する
public class TestExtension implements TestTemplateInvocationContextProvider {
// @TestTemplateを付けたテストメソッドはこのメソッドが実行される
@Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
List<Date> datelist= new ArrayList<Date>();
// テストしたい日付を追加する
List<TestTemplateInvocationContext> invList = new ArrayList<>();
// 設定日付の分処理を追加
datelist.forEach(target-> invList.add(addInvocation(target)));
return invList.stream();
}
//
private static class QiitaTestTemplateInvocationContext implements TestTemplateInvocationContext {
private final String name;
private List<Extension> extension;
/**
* コンストラクタ
*/
public QiitaTestTemplateInvocationContext(String name, List<Extension> extension) {
this.name = name;
this.extension = extension;
}
@Override
public String getDisplayName(int invocationIndex) {
return this.name;
}
@Override
public List<Extension> getAdditionalExtensions() {
return this.extension;
}
}
}
テストクラス
@ExtendWith({QiitaTestExtension.class})
public class MyTest {
@TestTemplate
public void test1() {
// 任意のテスト
}
}
上記の実装で// テストしたい日付を追加する
の箇所で対象日付を追加して
test1()
を実行すると対象日付の回数分、日付の名称でテストが実行される。
おわりに
結局、スマートになったかはわからないな…
あんま、使ってそうな人いないし、勉強にはなったからいいか!笑