私のプラグインmojoテストクラスは、maven-plugin-test-harness
を活用して、すべてのpom config、plexusコンテナコンテキストとリポジトリアクセスを持つ完全なmaven環境を構築します。maven-plugin-testing-harnessを使用した厳しい時間のmojoテスト
次は、すべて実際に動作するはずです:
- テストはモジョはモジョの注釈すべて
- からデフォルト値が取り込まれます
- プラグインプロジェクトのテストリソースディレクトリにテスト
pom.xml
を参照しますテストpomの指定された構成が受け入れられます - mavenプロジェクトオブジェクトが初期化されます
- リポジトリからのすべての依存関係が利用可能です
- テストがあるので、私はSOから収集したものを使用して、さまざまな修正をしようとし、他のしてきた具体的な作業実施例の不足のCIサーバ
上だけでなく、IntelliJのIDEでMavenを渡す必要がありますブログや記事をオンラインでご覧ください。
現在、mavenにアーチファクトを解決させるのに苦労しています。私はmavenプロジェクトオブジェクトから依存関係リストを取得していますが、アーティファクトリストは空です。
これは私がAbstractMojoTestCase
を解剖して構築したものです。
JUnit5で@Rules
を使用していないため、MojoRule
は使用できません。
さらに、いくつかのmaven API呼び出しは廃止されましたが、新しい実装が見つかりませんでした。私はそれがmvn4まで来ないと思う。以下の見積もりを参照してください。
@BeforeEach
protected void setUp() throws Exception {
super.setUp();
cleanUp();
ClassLoader classLoader = getClass().getClassLoader();
URL url = classLoader.getResource(TEST_POM);
if (url == null) {
throw new MojoExecutionException(String.format(
"Cannot locate %s", TEST_POM));
}
File pom = new File(url.getFile());
//noinspection deprecation - wait on maven-plugin-testing-harness update
MavenSettingsBuilder mavenSettingsBuilder = (MavenSettingsBuilder)
getContainer().lookup(MavenSettingsBuilder.ROLE);
Settings settings = mavenSettingsBuilder.buildSettings();
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
request.setPom(pom);
request.setLocalRepositoryPath(settings.getLocalRepository());
MavenExecutionRequestPopulator populator =
getContainer().lookup(MavenExecutionRequestPopulator.class);
populator.populateDefaults(request);
DefaultMaven maven = (DefaultMaven) getContainer().lookup(Maven.class);
DefaultRepositorySystemSession repoSession =
(DefaultRepositorySystemSession)
maven.newRepositorySession(request);
LocalRepository localRepository = new LocalRepository(
request.getLocalRepository().getBasedir());
SimpleLocalRepositoryManagerFactory factory =
new SimpleLocalRepositoryManagerFactory();
LocalRepositoryManager localRepositoryManager =
factory.newInstance(repoSession, localRepository);
repoSession.setLocalRepositoryManager(localRepositoryManager);
ProjectBuildingRequest buildingRequest =
request.getProjectBuildingRequest()
.setRepositorySession(repoSession)
.setResolveDependencies(true);
ProjectBuilder projectBuilder = lookup(ProjectBuilder.class);
MavenProject project =
projectBuilder.build(pom, buildingRequest).getProject();
//noinspection deprecation - wait on maven-plugin-testing-harness update
MavenSession session = new MavenSession(getContainer(), repoSession,
request, new DefaultMavenExecutionResult());
session.setCurrentProject(project);
session.setProjects(Collections.singletonList(project));
request.setSystemProperties(System.getProperties());
testMojo = (GenerateConfig) lookupConfiguredMojo(session,
newMojoExecution("configure"));
copyTestProjectResourcesToTarget(getContainer(), project, session);
}
[UPDATE 2017年7月27日]は:実際には、これが今の私の問題のほとんどを解決します。たぶん私は(MavenSettingsBuilder.buildSettings()
を使用して)、それを行うためのより良い方法があるとし
- のsettings.xmlをつかむためにコードが
@Deprecated
としてマークされ - :今だけマイナーな問題のいくつ
かなり多くのセットアップコードは、ネイティブのMavenで動作しているときに発生するプロセスを複製しますが、IntelliJでJUnitを実行する必要があります。
[UPDATE 2017年8月1日]:テストは今target/classes
ディレクトリでライブ環境でクラスパスになり、いくつかのプロパティファイルにアクセスする必要があります。
論理的には、私のmaven-pluginプロジェクトのテストリソースです。したがって、pom.xml
というディレクトリとsrc/test/resources/my-test-project
dirというディレクトリにそれらを含めました。
それはうまくいきませんでしたので、私もsrc/test/resources/my-test-project/src/main/resources
を試しましたが、それはまた良くありません。
私は、テスト中にプラグインのクラスパスに正確に何が設定されているのか、それが正しく構築されるようにする方法を考え出すのが苦労しています。
[UPDATE 2017-08-02]:私は自分の質問に答えましたが(この質問を延長するのとは対照的に)、この全体がまだ完成していないので、まだ。
そして、ちょうどレコードの、これらは、必要な依存関係です:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.0-M4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>4.12.0-M4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-testing</groupId>
<artifactId>maven-plugin-testing-harness</artifactId>
<version>3.3.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-container-default</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-compat</artifactId>
<version>3.5.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.twdata.maven</groupId>
<artifactId>mojo-executor</artifactId>
<version>2.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
[UPDATE 2017年8月9日]:
私はいくつかのより多くの機能を追加する必要がありますし、テストすることを発見アンパックしたい依存関係が既にローカルリポジトリにあった場合は問題ありませんでしたが、そうでない場合はフェッチしません。
ここで、リモートリポジトリから依存関係をフェッチするようにmavenに指示する方法を決定する必要があります。
私は依存関係プラグインを起動し、テストセットアップでresolve
を呼び出そうとしましたが、ひどく死んでしまいました。私はより簡単な方法が必要だと思います。
まずあなたが意見している場合改善に貢献していない理由、など、文書悪いですそれ ?さらに、これまでに持っていた仕事の完全な実例を見せてもらえますか?私たちがそれを見ることができるギタープロジェクトがベストでしょうか? – khmarbaise
あなたはコミッターですか?私は実際に私のテストを完全に機能させることができることに依存していますが、喜んでサンプルを寄稿/ javadocを改善します。ここで私はmaven-plugin-test-harnessに関するいくつかの質問を見ていますが、プロジェクトを「スムーズ」なアプリにするにはまだ十分ではありません。私もグーグルでは見つけられませんでした。どこかでネット上でディスカッションする必要があると思います。おそらく、検索エンジンによってインデックスが作成されていないmaven用の開発者リストのメールアーカイブですか? – Adam
ユーザーメーリングリストは、http://www.mail-archive.com/[email protected]/で検索できます。あなたのテストがgithubの完全な実例を実行するのを助けることは助けになるでしょう...それを改善するために貢献したいなら、それは素晴らしいことでしょう。 – khmarbaise