多模块项目中的maven测试资源

时间:2017-11-27 05:12:04

标签: java maven

我正在重构一个多模块项目,它依赖于一个模块 - shared-resources - 用于主资源和测试资源。

parent
|_ shared-resources
|_ child

目前,模块使用shared-resources包含maven-resource-plugin

当前child/pom.xml

...
<resources>
  <resource>
    <directory>../shared-resources/src/main/resources</directory>
  </resource>
</resources>
<testResources>
  <testResource>
    <directory>../shared-resources/src/test/resources</directory>
  </testResource>
</testResources>
...

我想重构依赖关系,以便通过shared-resources模块的jar和test-jar包装将它们包含在内,作为一些相关问题(例如“Specify common resources in a multi-module maven project”和“{{3 }}“) 建议。

shared-resources/pom.xml

...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
...

child/pom.xml

...
<dependency>
  <groupId>com.example</groupId>
  <artifactId>shared-resources</artifactId>
  <version>0.0.1</version>
</dependency>
<dependency>
  <groupId>com.example</groupId>
  <artifactId>shared-resources</artifactId>
  <version>0.0.1</version>
  <scope>test</scope>
  <type>test-jar</type>
</dependency>
...

当我为孩子运行测试时,测试缺少资源。

我以各种方式运行我的构建:

maven clean test --projects child --also-make

maven clean install -DskipTests && mvn test --projects child

maven clean verify --projects child --also-make

我的权威测试已经mvn clean install -DskipTests -pl :child -am && mvn test -pl :child -Dtest='PropertiesAccessTest',其中属性访问测试执行:

  public class PropertiesAccessTest {

    @Test
    public void resourceAccessible() throws URISyntaxException, IOException {
        propertyExists(
                "abcdef=12345",
                "test.properties"
        );
    }

    private void propertyExists(String string, String fileName) throws IOException, URISyntaxException {
        URL url = getClass().getClassLoader().getResource(fileName);
        assertNotNull(url);
        assertTrue("file should exist", new File(url.getFile()).exists());

        assertTrue("file should contain property", Files.readAllLines(Paths.get(url.toURI()))
                .stream().anyMatch(l -> l.contains(string)));
    }
}

test.properties中有一个对应的shared-resources/src/test/resources/(应该包括我理解上面的配置),但测试总是失败,“文件应该存在。”

我可以验证我的本地.m2存储库是否包含按预期包含测试资源的测试jar。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您将文件放入单独的模块中。这意味着它现在将嵌入到JAR文件中。您无法再创建File了。但您可以通过URI和InputStream访问它:

getClass().getClassLoader().getResource("test.properties").openStream()

然而,使用生产资源更有趣。如果您运行target/classes/test.properties,Maven将使用mvn test。此File一起使用。但是如果你改为运行mvn package - 它不会。因为在package之后,Maven会将jar文件放入classpath而不是target/classes