Java 如何使用JUnit4测试maven插件
我正在编写一个maven插件,并想编写一些JUnit测试。我跟着描述走了。不幸的是,在测试设置期间,在我可以配置或调用任何东西之前,我一直得到一个异常 这是我的JUnit测试代码:Java 如何使用JUnit4测试maven插件,java,maven,maven-plugin,junit4,Java,Maven,Maven Plugin,Junit4,我正在编写一个maven插件,并想编写一些JUnit测试。我跟着描述走了。不幸的是,在测试设置期间,在我可以配置或调用任何东西之前,我一直得到一个异常 这是我的JUnit测试代码: public class ResetMojoTest { private static final String POM_FILE_NAME = "/path/to/pom.xml"; @Rule public MojoRule rule = new MojoRule(); @
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)
java.io.IOException:流已关闭
位于java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:218)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:237)
位于org.apache.commons.io.input.BOMInputStream.getBOM(BOMInputStream.java:175)
位于org.apache.commons.io.input.BOMInputStream.getBOMCharsetName(BOMInputStream.java:201)
位于org.apache.commons.io.input.XmlStreamReader.doRawStream(XmlStreamReader.java:412)
位于org.apache.commons.io.input.XmlStreamReader。(XmlStreamReader.java:206)
位于org.apache.commons.io.input.XmlStreamReader.(XmlStreamReader.java:171)
位于org.apache.commons.io.input.XmlStreamReader。(XmlStreamReader.java:140)
位于org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:119)
位于org.apache.maven.plugin.testing.MojoRule$2.evaluate(MojoRule.java:299)
位于org.junit.rules.RunRules.evaluate(RunRules.java:20)
关于如何使其工作,有什么想法吗?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";
也遇到了这个问题。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>
我也有同样的问题。通过添加正确的依赖项解决了此问题。重要的是,标记为由harness maven插件提供的依赖项被添加到测试范围:
<properties>
<dependency.maven.version>3.3.9</dependency.maven.version>
<!-- and others -->
</properties>
<dependencies>
<!-- your dependencies -->
<!-- maven plugin dependencies -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<!-- test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${dependency.junit.version}</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>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>${dependency.maven.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-compat</artifactId>
<version>${dependency.maven.version}</version>
<scope>test</scope>
</dependency>
<!-- provided maven dependencies -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
希望这有助于解决同一问题的其他人是的,示例无法编译。但无论如何,这并不重要。如果查看堆栈跟踪,您会发现它崩溃的时间要早得多。测试方法从未执行过。这意味着什么?此代码不会被执行。正在崩溃的是MojoRule
设置。您的pom文件真正位于哪里?您使用的路径看起来错误,因为它以/…
开头。方法getTestFile
在上不存在。甚至有一个声明说示例文档是错误的。更糟糕的是,错误已经关闭,并且没有像评论所说的那样修复!你解决这个问题了吗?
<properties>
<dependency.maven.version>3.3.9</dependency.maven.version>
<!-- and others -->
</properties>
<dependencies>
<!-- your dependencies -->
<!-- maven plugin dependencies -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${dependency.maven.version}</version>
</dependency>
<!-- test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${dependency.junit.version}</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>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>${dependency.maven.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-compat</artifactId>
<version>${dependency.maven.version}</version>
<scope>test</scope>
</dependency>
<!-- provided maven dependencies -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
public class YourMojoTest {
@Rule
public MojoRule rule = new MojoRule();
@Test
public void shouldExecuteMojo() throws Exception {
// given
File testPom = new File(PlexusTestCase.getBasedir(), "src/test/resources/pom.xml");
final Properties properties = new Properties();
final MavenProject mavenProject = Mockito.mock(MavenProject.class);
Mockito.when(mavenProject.getProperties()).thenReturn(properties);
// when
YourMojo mojo = (YourMojo) rule.lookupMojo("fetch", testPom);
assertNotNull(mojo);
mojo.setProject(mavenProject);
mojo.execute();
// then
// do your tests ...
}
}