我正在寻找有关如何为 Maven 插件编写单元测试的信息。尽管 Maven 站点上有关于此主题的页面,但只有一个示例单元测试,没有任何用处。我还找到了这个wiki页面,但它已经4年多没有更新了,所以我不愿意对它投入任何信心。
我查了《The Definitive Guide to Maven》这本书,但它根本没有提到这个主题。我想用 Groovy 或 Java 编写单元测试,并且希望获得有关如何执行此操作的任何信息。
我使用的是 Maven 版本 2.1.0。
您发布的第一个链接是了解各种可能性并开始的正确位置。但举例来说,最好的办法是查看现有插件的来源。话虽如此:
maven-plugin-testing-harness
。您可以在 Maven Plugin Harness Wiki 中了解(一点)更多信息,但是,正如我所说,特别是在使用它的插件中,例如 maven-compiler-plugin
。检查CompilerMojoTestCase
。
对于集成测试(IMO 对于插件进行集成测试非常重要),我推荐
shitty-maven-plugin
(超级有用的集成测试 ThingY),特别是如果您有兴趣在 Groovy 中编写测试,或者maven-invoker-plugin
。它们很相似,但都具有另一个所没有的功能。 SHITTY 插件的网站提到了几个使用它的插件。看看吧。
如果您确实在插件中进行了单元测试,则第一个链接是正确的。但这在一定程度上取决于您想在这里测试什么。该功能的实现还是与Maven结合?但我的经验是,对插件进行某种集成测试可能会更好。为此,您应该深入研究 Maven Invoker Plugin,它可以为您提供帮助。也许您应该看看其他插件,它们现有如何进行测试。
Maven 插件的单元测试是一项相当复杂的任务,主要是因为在插件开始工作之前必须模拟(或创建)和注入依赖项。同时,借助
maven-invoker-plugin
进行集成测试可能会相当慢,尤其是当测试数量相当大时。我创建了 Farea
,它介于单元测试和集成测试之间。你可以这样使用它:
@Test
void worksAsExpected(@TempDir Path dir) {
new Farea(dir).together(f -> {
f.files()
.file("src/test/java/Hello.java")
.write("class Hello {}".getBytes());
f.dependencies().append("org.cactoos", "cactoos", "0.55.0");
f.plugins().appendItself(); // here!
f.exec("compile");
MatcherAssert.assertThat(
"Compiles without any issues",
f.files().log(),
RequisiteMatcher.SUCCESS
);
});
}
此 JUnit 测试方法将创建一个新的临时目录,其中包含
pom.xml
,然后运行 mvn
进程,收集其日志。这种方法的主要优点是执行速度。它比 maven-invoker-plugin
更快(当然,可配置性较差)。