ユニットテスト(mockを使用)と統合テスト(maven-invoker-pluginを使用)を介してプラグインをテストする2つのレベルです。統合テストのために
は、新しいMavenのプラグインのMaven原型はすでにちょうど次のコマンドを実行し、ボックスの外に良い例を提供し、それを見て:あなたは統合を取得しますデフォルトでは
mvn archetype:generate \
-DgroupId=sample.plugin \
-DartifactId=hello-maven-plugin \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-plugin
プロファイルでテストを開始します。サンプルのmavenプロジェクトは、プラグインの目的を実行できるsrc \ it \ simple-it \ pom.xmlの下にもあります。私が示唆しているのは、そのpom.xmlの追加の制約を使って、統合テストの結果を強制することです。たとえば、Maven Enforcer Pluginルールを追加して、作成したファイルがプラグインに適しているかどうかを確認することができます。
- のJUnit + Mockito: は、カスタムのMavenプラグインのユニットテストを書く方法についてのご質問には、より具体的に答えるために、これは私が使用しているアプローチです。
- @RunWith(MockitoJUnitRunner.class)を使用して実行しているテストケース
- Mock固有のクラス(MavenProject、Log、Build、DependencyNodeなど))プラグインをテスト)を開始し、@Before方法(通常のsetUp()メソッドでは、あなたのモックオブジェクトをリンク@Mockのアノテーション
- を
- 使用して:)
例として、次のことを嘲笑しているかもしれませんあなたのユニットテストのクラス変数などのオブジェクト:
@Mock
private MavenProject project;
@Mock
private Log log;
@Mock
Build build;
その後は、あなたの@Beforeメソッドでは、次のようにグルーコードの大きなを追加する必要があります。
Mockito.when(this.project.getBuild()).thenReturn(this.build);
例えば
私はので、私は
@Mock
private EnforcerRuleHelper helper;
そして@Beforeメソッドに必要な、いくつかのカスタムEnforcerプラグインのルールを記述するために使用し、:
Mockito.when(this.helper.evaluate("${project}")).thenReturn(this.project);
Mockito.when(this.helper.getLog()).thenReturn(this.log);
Mockito.when(this.project.getBuild()).thenReturn(this.build);
Mockito.when(this.helper.getComponent(DependencyGraphBuilder.class)).thenReturn(this.graphBuilder);
Mockito.when(this.graphBuilder.buildDependencyGraph(this.project, null)).thenReturn(this.node);
このように、これらを使用して簡単になりますオブジェクトをあなたのテストにモックする。例えば、第1のダミーテストは(カスタムエンフォーサルールをテストの下)以下のように空のビルドに対してそれをテストすることです持っている必要があります。
@Test
public void testEmptyBuild() throws Exception {
try {
this.rule.execute(this.helper);
} catch (EnforcerRuleException e) {
Assert.fail("Rule should not fail");
}
}
あなたは、例えば、ビルドの依存関係に対してテストする必要がある場合は、あなたを
private static DependencyNode generateNode(String groupId, String artifactId, String version) {
DependencyNode node = Mockito.mock(DependencyNode.class);
Artifact artifact = Mockito.mock(Artifact.class);
Mockito.when(node.getArtifact()).thenReturn(artifact);
// mock artifact
Mockito.when(artifact.getGroupId()).thenReturn(groupId);
Mockito.when(artifact.getArtifactId()).thenReturn(artifactId);
Mockito.when(artifact.getVersion()).thenReturn(version);
return node;
}
を簡単に以下のように、ビルドの依存関係グラフに依存関係を作成するには:
List<DependencyNode> nodes = new ArrayList<DependencyNode>();
nodes.add(generateNode("junit", "junit", "4.12"));
Mockito.when(node.getChildren()).thenReturn(nodes);
注:ヨーヨーを次のようにユーティリティメソッドを書き終わるかもしれませんより詳細な情報(スコープや依存関係のための分類子など)が必要な場合は、ユーティリティメソッドを改善することができます。
あなたも、あなたは、例えば、既存のプラグインとその設定をスキャンする必要があるため、次のようにそれを行うことができ、プラグインの設定を模擬する必要がある場合:
List<Plugin> plugins = new ArrayList<Plugin>();
Plugin p = new Plugin(); // no need to mock it
p.setArtifactId("maven-surefire-plugin");
Xpp3Dom conf = new Xpp3Dom("configuration");
Xpp3Dom skip = new Xpp3Dom("skip");
skip.setValue("true");
conf.addChild(skip);
p.setConfiguration(conf);
plugins.add(p);
Mockito.when(this.build.getPlugins()).thenReturn(plugins);
私は明らかにすべてカバーしています可能性のあるケースがありますが、アプローチと使用方法について理解していることを確認しています。それが役に立てば幸い。
これに関するニュースはありますか?これは非常に役に立つでしょう – pigiuz
ここにはニュースはありませんが、おそらく投票の質問は助けになるでしょうか? :-) – dermoritz