代码之家  ›  专栏  ›  技术社区  ›  Kannan Ekanath

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

  •  4
  • Kannan Ekanath  · 技术社区  · 15 年前

    我在Maven项目B(项目A的一个子项目)中的测试代码有

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

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

    我知道我可以做一些编码检查测试用例是否从父/子模块运行,但显然我想知道 其他 他们有这个问题的时候做过吗?

    不,我不能用类路径代替(因为各种无聊的原因)。

    我也尝试了相对路径,但是后来测试用例开始了解得太多了。有没有真正的解决办法?

    更新(12/2月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插件中的web xml属性。这似乎解决了我的问题。但是,在输出战中,我有一个web.xml和另一个冗余的web.xml(因为它在类路径中而被复制)。

    我尝试过“packageexcludes”和“webresources/excludes”,并使用war插件来省略第二个web.xml,但仍然会复制目录“console webapp”(尽管是空的)。有没有办法告诉Maven War插件完全忽略一个目录(也就是说,Ant的模式是什么?)

    2 回复  |  直到 15 年前
        1
  •  7
  •   Romain Linsolas    15 年前

    Maven2约定声明所有测试资源(包括您在测试中尝试使用的文件)都必须存储在 src/test/resources 文件夹。如果您遵守这个约定,就可以直接从类路径获取文件。这些资源将 包括在最终包装中(罐子,战争,耳朵…)。

    当然,您可以更改目录,然后在 pom.xml :

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

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

        2
  •  2
  •   George Armhold    15 年前

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

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