2010-02-11 57 views
4

我在Maven项目B(它是项目A的子项)中的测试代码类似于从Maven获取JUnit测试用例中最简单的文件的方法

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

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

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

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

我也试过相对路径,但后来测试用例开始知道太多了。实际上有解决方案吗?

UPDATE(12/Feb) - 我在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插件完全忽略一个目录(即什么是蚂蚁模式?)

+1

Maven 2测试是在单独的进程中的module目录下运行的。这意味着“src/main/webapp”应该可以很好地工作,无论它从哪里被调用。你在用surefire插件进行测试吗? JUnit/TestNG?你有没有禁用forfire? – artemb 2010-02-11 12:19:11

回答

7

Maven 2约定规定,所有的测试资源,包括文件,如你正在尝试在您的测试中使用,必须存储在src/test/resources文件夹中。如果你遵守这个约定,你将能够直接从类路径中获取你的文件。这些资源将而不是包含在最终包装(JAR,WAR,EAR ...)中。

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

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

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

+1

+1提到按惯例,所有测试资源都应该进入src/test/resources。 – 2010-02-11 12:26:17

+1

以上是真实的,但OP很可能不会尝试加载测试资源,而是来自webapp的文件。 – 2010-02-11 16:10:47

+0

帕斯卡你是对的。我用我的研究结果中的一些细节更新了这个问题。谢谢 :) – 2010-02-12 10:56:33

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; 
    } 
}