Maven Plugin(Mojo)开发中单元测试备忘

2015-10-18  本文已影响1327人  jackzh

昨天准备就现在开发中的问题写一个Maven插件,完成一些代码的自动生成。在好几年前写过几个插件,这次重新找开看后,发现原来的都很简单,所以都没有在开发期间的进行测试。考虑到这次写的稍微复杂一些,如果每次修改到东西都要到目标项目中进行测试,那么效率太差了,所以准备先把插件开发中相关的单元测试搞定。

谁成想,这样一下子发现了一个大坑。过程是这样的:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-plugin-plugin:3.3:descriptor (default-descriptor) on project scaffold-maven-plugin: Execution default-descriptor of goal org.apache.maven.plugins:maven-plugin-plugin:3.3:descriptor failed: String index out of range: -1 -> [Help 1]

幸好有google在(真难以相像如果使用百度会是一个怎么样的结果),经过长时间各种搜索发现了一篇最有用的文章Write Unit Tests for a Maven plug-in[感谢作者帮我解决了这个大问题],它解决了基本所有的问题,下面摘录一些要点:

在这个实例中使用的版本是3.2.2,我自己经过测试,发现3.2.3也是可以使用的。另外,由于在Mojo中会使用如MavenProject这样的对象,这样的类差不多都在maven-core中,如果在compile时发现类找不到,可以将依赖中下面几个scopetest的修改为provided

由于 走过了一些弯路,所以上面的代码是今天早上起床时才突然想到的,因为原来一起使用AbstractMojoTestCase,按那个思路在解决问题。今天早上突然回想起这个文章的这后半部分,说实在的,在刚看到文章时,this.rule.lookupMojo()这行其实出现了问题,所以就又回到原来的老路上。但是结合昨天查询到的其它的文章:

只要把测试用例中的代码修改为:
File projectCopy = this.resources.getBasedir("project-to-test");
File pom = new File(projectCopy, "pom.xml");
Assert.assertNotNull(pom);
Assert.assertTrue(pom.exists());

  MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
  ProjectBuildingRequest configuration = executionRequest.getProjectBuildingRequest()
              .setRepositorySession(new DefaultRepositorySystemSession());
  MavenProject project = rule.lookup(ProjectBuilder.class).build(pom, configuration).getProject();

  HibernateMojo mojo = (HibernateMojo) rule.lookupConfiguredMojo(project, "validate");
  Assert.assertNotNull(mojo);
  mojo.execute();

就可以解决在Mojo中无法识别${}expression的问题了。

最后,以下是几个Mojo开发中有用的链接,备忘:

上一篇 下一篇

猜你喜欢

热点阅读