Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JUnit4测试maven插件_Java_Maven_Maven Plugin_Junit4 - Fatal编程技术网

Java 如何使用JUnit4测试maven插件

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(); @

我正在编写一个maven插件,并想编写一些JUnit测试。我跟着描述走了。不幸的是,在测试设置期间,在我可以配置或调用任何东西之前,我一直得到一个异常

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