使用maven-plugin-testing-harness测试Maven插件

我想开发一个Maven插件并正确测试它。 我正在阅读有关maven-plugin-testing-harness的文档并尝试了几个小时。 我经常NoClassDefFoundErrorNoSuchMethodError ,我无法弄清楚我需要哪些依赖项。

这是我的MCVE:

https://github.com/highsource/hello-maven-plugin

现在我得到:

 java.lang.NoClassDefFoundError: org/apache/maven/plugin/descriptor/PluginDescriptorBuilder at org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:161) at junit.framework.TestCase.runBare(TestCase.java:139) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at junit.framework.TestSuite.runTest(TestSuite.java:255) at junit.framework.TestSuite.run(TestSuite.java:250) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: java.lang.ClassNotFoundException: org.apache.maven.plugin.descriptor.PluginDescriptorBuilder at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 15 more 

这是我的插件的pom.xml

  4.0.0 org.hisrc.storyteller storyteller-maven-plugin maven-plugin 1.0-SNAPSHOT storyteller-maven-plugin Maven Mojo   org.apache.maven maven-plugin-api 2.0   org.apache.maven maven-core 3.3.9   org.apache.maven maven-artifact 3.3.9 provided   org.apache.maven maven-compat 3.3.9   junit junit 4.11 test   org.apache.maven.plugin-testing maven-plugin-testing-harness test 3.3.0    

MyMojo.java很简单:

 /** * Goal which touches a timestamp file. * * @goal touch * * @phase process-sources */ public class MyMojo extends AbstractMojo { /** * Location of the file. * * @parameter expression="${project.build.directory}" * @required */ private File outputDirectory; public void execute() throws MojoExecutionException { // Simply creates a touch.txt file in outputDirectory } } 

考试:

 public class MyMojoTest extends AbstractMojoTestCase { @Test public void testSomething() throws Exception { File pom = getTestFile( "src/test/resources/org/hisrc/storyteller/pom.xml" ); assertNotNull( pom ); assertTrue( pom.exists() ); MyMojo myMojo = (MyMojo) lookupMojo( "touch", pom ); assertNotNull( myMojo ); myMojo.execute(); } } 

用于测试的pom.xml

  4.0.0 org.hisrc.storyteller project-to-test 1.0-SNAPSHOT jar Test MyMojo   junit junit 4.11 test      storyteller-maven-plugin  target/test-harness/project-to-test      

如果我将maven-plugin-api的版本更改为3.0 ,我会得到:

 java.lang.NoSuchMethodError: org.codehaus.plexus.ContainerConfiguration.setClassPathScanning(Ljava/lang/String;)Lorg/codehaus/plexus/ContainerConfiguration; at org.apache.maven.plugin.testing.AbstractMojoTestCase.setupContainerConfiguration(AbstractMojoTestCase.java:285) at org.apache.maven.plugin.testing.AbstractMojoTestCase.setupContainer(AbstractMojoTestCase.java:259) at org.apache.maven.plugin.testing.AbstractMojoTestCase.getContainer(AbstractMojoTestCase.java:298) at org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:152) at junit.framework.TestCase.runBare(TestCase.java:139) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at junit.framework.TestSuite.runTest(TestSuite.java:255) at junit.framework.TestSuite.run(TestSuite.java:250) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

我环顾四周,我看到的是,人们似乎添加了一些随机的依赖关系,有时事情有时不起作用。 我花了几个小时尝试做同样的事情,但没有设法让它工作。 我现在非常绝望,并希望有人最终弄清楚它并指出我正确的依赖关系和/或版本。

@FlorianAlbrecht是对的,我必须为Maven依赖项指定相同的版本( 3.3.9 )。 这就是我最终的结果:

  3.3.9    org.apache.maven.plugin-tools maven-plugin-annotations 3.5 provided   org.apache.maven maven-plugin-api ${maven.version}   org.apache.maven maven-core ${maven.version}   org.apache.maven maven-artifact ${maven.version} provided   org.apache.maven maven-compat ${maven.version}   junit junit 4.11 test   org.apache.maven.plugin-testing maven-plugin-testing-harness test 3.3.0