从Maven获取JUnit测试用例中最简单的文件的方法

时间:2010-02-11 11:56:11

标签: java maven-2 junit

我在Maven项目B(项目A的子项)中的测试代码具有类似

的内容
String filePath = "src/main/webapp";
//do something with the filePath

当我从子项运行项目(即B级)时,上面的测试用例运行正常但是当我从父项目A运行时(即,在父级别执行mvn安装),这会失败,因为很明显没有调用文件夹父级别下的“src / main / webapp”(但在子级别可用)。

我知道我可以做一些编码检查测试用例是否从父/子模块运行但是显然我想知道其他在遇到这个问题时做了什么?

不,我不能使用类路径(出于各种无聊的原因)。

我也试过相对路径,但后来测试用例开始变得太多了。实际上是否存在解决方案呢?

更新(12月2日) - 我在webapp文件夹下有一个web.xml,并使用该web.xml在测试用例中创建一个jetty服务器。理想情况下,src / main / webapp不会放在类路径中。 WAR插件使用它来打包WAR。现在,我尝试了另一种方法,我将web.xml放在src / main / resource / console-webapp / WEB-INF / web.xml目录中,并更改了maven war插件中的webXml属性。这似乎解决了我的问题。但是,在输出WAR中我有一个web.xml和另一个冗余web.xml(由于它在类路径中而被复制)。

我尝试了“packageExcludes”和“webResources / excludes”并获得了war插件以省略第二个web.xml但仍然复制了目录“console-webapp”(尽管是空的)。有没有办法告诉maven war插件完全忽略一个目录(即什么是蚂蚁模式?)

2 个答案:

答案 0 :(得分:7)

Maven 2约定声明所有测试资源(包括您尝试在测试中使用的文件)必须存储在src/test/resources文件夹中。如果您遵守此约定,则可以直接从类路径获取文件。这些资源将包含在最终包装中(JAR,WAR,EAR ......)。

当然,您可以更改目录,然后在pom.xml中指定新的测试资源目录:

<build>
    <testResources>
        <testResource>
            <directory>...</directory>
        </testResource>
    </testResources>
    ...

在您的问题中,您指定不能使用类路径。为什么这样?

答案 1 :(得分:2)

您尝试在测试类路径上访问的文件是什么?如果是这样,那怎么样:

public class IOUtils {

  public URL getResourceAsURL(String resource) {
    ClassLoader cl = getClass().getClassLoader();
    return cl.getResource(resource);
  }


  public static InputStream getResourceAsStream(String resource) throws IOException  {
    ClassLoader cl = getClass().getClassLoader();
    InputStream in = cl.getResourceAsStream(resource);

    if (in == null) 
      throw new IOException("resource \"" + resource + "\" not found");

    return in;
  }
}