java - 如何使用 JUnit4 测试 Maven 插件

标签 java maven maven-plugin junit4

我正在编写一个 Maven 插件并想编写一些 JUnit 测试。我遵循了 Maven Plugin Testing 中的描述.不幸的是,在我配置或调用任何东西之前,我在测试设置期间不断收到异常。

这是我的 JUnit 测试代码:

public class ResetMojoTest {

    private static final String POM_FILE_NAME = "/path/to/pom.xml"; 

    @Rule
    public MojoRule rule = new MojoRule();

    @Test
    public void testSomething()
        throws Exception
    {
        File pom = new File(POM_FILE_NAME);
        Assert.assertNotNull( pom );
        Assert.assertTrue( pom.exists() );

        ResetMojo resetMojo = (ResetMojo) rule.lookupMojo( "touch", pom );
        Assert.assertNotNull( resetMojo );
        resetMojo.execute();
    }

}

这是异常的堆栈跟踪:

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
    at org.apache.commons.io.input.BOMInputStream.getBOM(BOMInputStream.java:175)
    at org.apache.commons.io.input.BOMInputStream.getBOMCharsetName(BOMInputStream.java:201)
    at org.apache.commons.io.input.XmlStreamReader.doRawStream(XmlStreamReader.java:412)
    at org.apache.commons.io.input.XmlStreamReader.<init>(XmlStreamReader.java:206)
    at org.apache.commons.io.input.XmlStreamReader.<init>(XmlStreamReader.java:171)
    at org.apache.commons.io.input.XmlStreamReader.<init>(XmlStreamReader.java:140)
    at org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:119)
    at org.apache.maven.plugin.testing.MojoRule$2.evaluate(MojoRule.java:299)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)

关于如何让它工作有什么想法吗?

最佳答案

也遇到了这个问题。 mojo 规则失败,因为它实例化了 AbstractMojoTestCase 的匿名实现,然后查找然后尝试创建输入流加载数据:InputStream is = getClass().getResourceAsStream( "/"+ getPluginDescriptorLocation() );。这 (getPluginDescriptorLocation()) 只是一个硬编码的文件字符串 "META-INF/maven/plugin.xml"

我通过添加以下依赖项解决了这个问题:

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-compat</artifactId>
  <version>3.5.0</version>
</dependency>

我不确定为什么这样可以解决问题。该文件仍然不存在(我已经检查了原始源和 target 目录,但两者都不存在)。因此,需要进行额外的搜索才能弄清楚为什么会这样。

这里是我的依赖,供引用。

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.5.0</version>
</dependency>
<dependency>
  <groupId>org.twdata.maven</groupId>
  <artifactId>mojo-executor</artifactId>
  <version>2.3.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.eclipse.aether</groupId>
  <artifactId>aether-api</artifactId>
  <version>1.1.0</version>
</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>
</dependency>
<!--Test Dependencies-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.maven.plugin-testing</groupId>
  <artifactId>maven-plugin-testing-harness</artifactId>
  <version>3.3.0</version>
  <scope>test</scope>
</dependency>

关于java - 如何使用 JUnit4 测试 Maven 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278423/

相关文章:

java - 从文件系统以编程方式打开 Eclipse 自定义编辑器文件

java - 保留 lib 文件夹内未更改的 jar 的时间戳

java - 通过 Eclipse maven2 的 Pom/项目属性

Maven:与 jar 一起的属性文件

java - 无论测试失败如何使插件目标运行

java - 如何调试引导接收器?

java - MBean 未出现在 JConsole 中

Java Config @Bean 未在其他 @Configuration 类中 Autowiring

java - maven-bundle-plugin 不包含 Import-Package

maven-3 - 如何在 Maven "defaultValue"中填充参数 "AbstractMojoTestCase"?