我的插件mojo測試類利用maven-plugin-test-harness
來構建具有所有pom配置,plexus容器上下文和repo訪問權限的完整maven環境。使用maven-plugin-testing-harness的困難時間mojo測試
下都應該實際工作:
- 測試將參考在插件項目的測試資源目錄測試
pom.xml
- 的魔力將默認填充來自Mojo的註解
- 所有在測試pom中指定的配置被接受
- maven項目對象被初始化
- 所有從repo的依賴都可用 個
- 測試應該傳遞的IntelliJ IDE以及Maven的CI服務器上
由於缺乏具體的工作實例的我一直在嘗試使用的是什麼我從SO收集,以及其他許多不同的修復博客或在線文章。
我目前正在努力爭取解決文物的maven。雖然我從Maven項目對象獲得了依賴項列表,但是項目列表是空的。
這是我通過解剖AbstractMojoTestCase
而建立起來的。我不能使用MojoRule
,因爲JUnit5不再使用@Rules
。
另外,一些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);
}
[更新2017年7月27日]:其實這個現在解決了大多數我的問題。
只有幾個小問題現在:
- 代碼搶settings.xml中被標記爲
@Deprecated
所以我假設有這樣做的更好的方法(使用MavenSettingsBuilder.buildSettings()
) - 可能相當多的設置代碼是在本地maven中運行時發生的重複進程,但是需要在IntelliJ中使用JUnit運行。
[更新2017年8月1日]:現在測試需要訪問這將是在classpath在target/classes
DIR現場環境中的某些屬性文件。
從邏輯上講,它們是我的maven-plugin項目中的測試資源,所以我將它們包含在與的src/test/resources/my-test-project
dir相同的目錄下。
這並沒有工作,所以我也試過src/test/resources/my-test-project/src/main/resources
但這也不好。
我很難在測試過程中確定插件類路徑究竟是什麼,或者正在研究如何使它正確構建。
[更新2017年8月2日]:雖然我已經回答了我的問題(而不是擴展這個問題),這整個事情還沒有結束,所以我不標示這是相當回答然而。
和公正的記錄,這些都是需要的相關性:
<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>
[更新2017年8月9日]:
我必須添加一些更多的功能,發現測試如果它想解壓的依賴項已經存在於本地倉庫中,那麼它很好,但如果沒有,它將無法獲取它。
我現在需要確定如何指示maven從遠程倉庫獲取依賴關係。
我試着啓動依賴項插件,並在測試設置中調用resolve
,但它死得不好,我認爲必須有一個更簡單的方法。
首先,如果你認爲它是壞的記錄等等,爲什麼不幫助改善它呢?此外,你可以展示一個完整的工作例子,你的工作到目前爲止?最好是有一個github項目,我們可以看看它? – khmarbaise
你是提交者嗎?我很樂意提供示例/改進javadoc,儘管這要取決於能否讓我的測試充分發揮功能。儘管我在這裏看到了有關Maven-plugin-test-harness的一些問題,但仍然不足以使該項目成爲「一言難盡」的應用程序。我也找不到多少谷歌搜索。我認爲那裏的網絡必須有討論 - 可能是一個開發人員列表郵件存檔的maven,沒有被搜索引擎索引? – Adam
您可以通過以下網址搜索用戶郵件列表:http://www.mail-archive.com/[email protected]/。爲了幫助你的測試在github上運行一個完整的工作示例將會很有幫助...如果你願意貢獻於改進... – khmarbaise