Maven测试/资源目录和集成测试

Gro*_*fit 2 integration-testing maven-2 maven

希望应该是一个简单的问题......

我有一个集成测试模块,其中包含默认的目录结构:

src
|-main
|-test
  |-java
  |-resources
Run Code Online (Sandbox Code Playgroud)

然后在我的资源目录中,我有一个xxxx.xml和xxxx.xsd文件,我需要在测试中加载这些文件:

@Test
public void should_do_some_stuff_with_xml_and_xsd() // not actual test name
{
   File xmlFile = new File("xxxx.xml");
   File xsdFile = new File("xxxx.xsd");
   ...
}
Run Code Online (Sandbox Code Playgroud)

它一直在尝试加载文件失败,现在我认为这是由我需要从项目根目录或其他东西给它一个相对路径.我需要这个测试在我的IDE外部运行,所以我可以在构建服务器上运行测试...

所以我的问题是,我如何定位这些文件?

Sea*_*oyd 12

类路径机制不适用于文件.相对文件路径是从当前目录解析的,而不是从类路径元素解析的.

所以你可以做到

File xmlFile = new File("target/test-classes/xxxx.xml");
File xsdFile = new File("target/test-classes/xxxx.xsd");
Run Code Online (Sandbox Code Playgroud)

但是,更清晰的解决方案是使用InputStreams而不是文件.几乎每个支持File参数的库也支持InputStream参数.这样你就可以使用ClassLoader魔法而无需手动指定任何路径:

ClassLoader cldr = Thread.currentThread().getContextClassLoader();
InputStream xmlStream = cldr.getResourceAsStream("xxxx.xml");
InputStream xsdStream = cldr.getResourceAsStream("xxxx.xsd");
Run Code Online (Sandbox Code Playgroud)

参考: