2014-06-18 100 views
4

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

这是我的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) 

如何得到这个工作任何想法?

+0

你解决了这个问题吗? –

回答

-1

的POM文件的加载不好看:

下面的代码是从实例:

File pom = rule.getTestFile("src/test/resources/unit/project-to-test/pom.xml"); 

,这是你拥有的一切:

File pom = new File(POM_FILE_NAME); 

除了这你有一个不同的位置,看起来像这样:

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

但POM文件的位置应该是:

private static final String POM_FILE_NAME = "src/test/resources/pom.xml"; 
+0

是的,这个例子不能编译。但这无关紧要。如果你看看堆栈跟踪,你可以看到它早已崩溃。测试方法从不执行。 – BetaRide

+0

你看到代码的区别:'rule.getTestFile(....)'? – khmarbaise

+0

这意味着什么?此代码不会被执行。这是'MojoRule'设置崩溃。 – BetaRide

1

同样遇到此问题。 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>