Mavenプラグインのユニットテストを作成するために、maven-plugin-testing-harness
というライブラリが 提供されています。ここではこのライブラリをJUnitと組み合わせて、ユニットテストを作成する方法を紹介します。
pom.xmlに依存ライブラリを追記する
まずJUnitとmaven-plugin-testing-harness
を使用するために、以下2つの<dependency>
を pom.xml
に追加します。
<dependencies>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>{{book.version.junit}}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-testing</groupId>
<artifactId>maven-plugin-testing-harness</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
ユニットテストを作成する
追加したらユニットテストの作成を開始できます。 maven-plugin-testing-harness
ではJUnit4の@Rule
アノテーションを利用しての開発が可能です。 もっとも単純なテストは次のようになります。
public class SampleMojoTest {
@Rule
public MojoRule mojoRule = new MojoRule();
@Rule
public TestResources resources = new TestResources();
@Test
public void testMojoHasHelpGoal() throws Exception {
// src/test/projects/project/pom.xml に書かれた設定を元にMojoインスタンスを作成
File baseDir = resources.getBasedir("project");
File pom = new File(baseDir, "pom.xml");
// 'help' ゴールを実行
Mojo mojo = mojoRule.lookupMojo("help", pom);
mojo.execute();
}
}
MojoRule
はMojoインスタンスを生成するためのJUnit Ruleです。
TestResources
は各テストメソッドで固有のリソースを使うためのJUnit Ruleです。 src/test/projects
次にダミーのMavenプロジェクトが入ったディレクトリを配置しておき、 そのディレクトリ名をgetBasedir()
メソッドに渡すことで、ダミープロジェクトの設定を元に Mojoインスタンスを作成できます。
つまりこのテストは、ダミープロジェクトの設定を元に作成したMojoインスタンスのメソッドを呼ぶことで プラグインが正常に動作することを確認するためのものです。
期待どおりに正常終了することをテストする
前述のとおり、MojoRule
のインスタンスメソッドを通じて取得したMojo
インスタンスのexecute()
メソッドを呼ぶことで、 実際にMavenプラグインを実行できます。execute()
メソッドが例外を投げずに終了した場合、Mavenプラグインが 正常終了したとみなせます。
@Test
public void testGoalSucceeds() {
File baseDir = resources.getBasedir("project");
File pom = new File(baseDir, "pom.xml");
Mojo samplePlugin = mojoRule.lookupMojo("help", pom);
assertNotNull(samplePlugin);
samplePlugin.execute();
}
テスト内容によっては、実行時にMojoの状態を確認するコードなどを記述する必要があります。
期待どおりに異常終了することをテストする
設定に問題があるときや必要なファイルが存在しないときは、Mavenプラグインを異常終了させる必要があります。
JUnitのテストとしては、execute()
メソッドがMojoFailureException
あるいはMojoExecutionException
を投げることを確認するコードを書きます。 次のように@Test
アノテーションに期待される例外を指定してください。
@Test(expected = MojoFailureException.class)
public void testGoalFailsAsExpected() {
File baseDir = resources.getBasedir("project");
File pom = new File(baseDir, "pom.xml");
Mojo samplePlugin = mojoRule.lookupMojo("help", pom);
assertNotNull(samplePlugin);
samplePlugin.execute();
}
ログが正しく呼ばれていることを確認する
Mavenプラグインを使用するユーザは、ログを通じてプラグインからの結果報告や異常通知などを受けます。 このためログが特定の条件下で期待どおりに出ることは、ぜひテストで確認・保証しておきたいポイントです。
@Test
public void testSampleGoalPrintsOutputDirectory() throws Exception {
File baseDir = resources.getBasedir("simple");
File pom = new File(baseDir, "pom.xml");
Log log = Mockito.mock(Log.class);
Mojo samplePlugin = mojoRule.lookupMojo("sample", pom);
samplePlugin.setLog(log);
samplePlugin.execute();
Mockito.verify(log).debug("outputDirectory is /tmp/target");
}