2013-10-30 12 views
6

私のmaven-plugin用の単体テスト(junit4)を書いてみたい。 。私が使用する「AbstractMojoTestCase」(junit3 :-()見つかったすべての例で、このを取り除くためには、私はanswer hereを得たが、問題はMojosがインスタンスを取得する方法である:。Mavenプラグイン環境とプロジェクト構成を模擬する方法

MyMojo myMojo = (MyMojo) lookupMojo("touch", pom); 

私はすべてのテストケースのためのポンポンを必要とすることを意味し - POMはテスト入力データですが、私はMockitoを使う方法がありますか? lookupMojo(String groupId, String artifactId, String version, String goal, PlexusConfiguration pluginConfiguration)は良い出発点ですか?この場合、私は "PlexusConfiguration"を模倣しますが、どのメソッド? maven-plugin testing dokuは、 "MavenProjectStub"のようなクラスを使用していますが、モジョがどのように作成され、どのインテーフェイスが作成時に話し合っているかを一貫して見ることはできません。

そこに私の経験Mavenプラグインを書くこと、に基づいて

私はちょうど

@inject 
MyMojo testObject; 

、ちょうどそれが作業を取得する必要があるすべてのものを模擬することができればだろう完璧なソリューションは、(プライマリー私は@Parametersを必要とする)

+0

これに関するニュースはありますか?これは非常に役に立つでしょう – pigiuz

+0

ここにはニュースはありませんが、おそらく投票の質問は助けになるでしょうか? :-) – dermoritz

答えて

5

ユニットテスト(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); 

私は明らかにすべてカバーしています可能性のあるケースがありますが、アプローチと使用方法について理解していることを確認しています。それが役に立てば幸い。

関連する問題