2012-07-01 69 views
1

我无法获取单元测试以使用src\test\resources提供的资源而不是src\main\resources中的资源。是的,所讨论的资源在两个地方的命名都是相同的。无法让Maven(和Eclipse)在测试时使用测试资源

我做的研究相当多,看着StackOverflow的岗位,如:

但是这个基本问题已经难住了我。下src\test

的Eclipse下src\main

  • 测试源

    • 应用源&资源&资源(感谢m2eclipse插件)已经:

      我有一个非常标准的Maven的Java项目设置src\main\java,src\main\resourcessrc\test\javasrc\test\resources都在其构建路径中。

      使用此设置,当我在Eclipse资源文件中运行我的单元测试时,src\main\resources正在被引用。我可以看到为什么(因为它们处于构建路径中),但我不知道如何防止它。单元测试配置面板不允许我调整(默认)类路径组件的顺序。

      即使我想掩饰自己无法从Eclipse运行测试,Maven也不会很好玩。我可以看到processResources步骤是将所有测试资源复制到target\test-classes树下。但是,执行单元测试时,正在咨询target\classes下的资源文件的副本。

      当然,我可以俯视东西明显。我感谢您提供的任何帮助。

      [编辑] 添加更多(可能相关的信息)

      有问题的资源文件是一个名为persistence.xml文件。它由Eclipselink用于连接到关系数据源。该应用程序使用的文件版本位于src\main\resources\META-INF中。 (例如WAR的)Maven版本将META-INF目录放在classes目录下。因此EclipseLink工具找到这个文件。

      src/main 
          | 
          + -- java/com/company/ProductDao.java 
          | 
          + -- resources/META-INF/persistence.xml (Requires application container) 
          | 
      src/test 
          | 
          + -- java/com/company/ProductDaoTest.java 
          | 
          + -- resources/META-INF/persistence.xml (out of container for unit tests) 
          | 
      

      的外卖这里是:的EclipseLink需要在META-INF目录中称为persistence.xml在classpath文件(是的,默认可以重写,但我们不要去那里)。

      因此,当单元测试运行时,调用相同的应用程序逻辑。但是不能使用src\main\resources中的文件版本。A 不同版本src\test\resources目录中可用。

      由于正在使用src\main\resources中的版本,因此出现,我唯一的办法是在单元测试期间指示Eclipselink查找不同的文件名。

  • +0

    我敢肯定,你可以在你的src/main/resources/META-INF/persistence.xml中创建一个新的持久化单元,你可以在单元测试和Persistence.createEntityManagerFactory中使用这似乎是什么反正你会用两个persistence.xml文件来做。 –

    +0

    不同的持久性单元(可能)在同一个文件中。这是一个有趣的想法。我需要弄清楚如何指示类使用不同的持久性单元(PU)。在通过Java类上的注释识别PU之后(在我的情况下)使用Spring进行连线。感谢提示,我将不得不考虑它。 –

    回答

    1

    这不是Maven问题的根源。如果您将所有内容都合并为一个源文件夹,则会出现完全相同的问题。想想你在做什么。你的单元测试需要来自src/main的代码,否则它不会成为该代码的单元测试。 src/main/java和src/main/resources组成你正在测试的工件。你不要混合和匹配单元测试的目录。

    你基本上是这样做的:

    /src/com/mycompany/myresource.txt   
    /src/com/mycompany/MyAwesomeClass.java 
    /src/com/mycompany/myresource.txt 
    /src/com/mycompany/TestMyAwesomeClass.java 
    

    不要那样做。配置您的单元测试以从其他文件加载模拟数据/您的资源文件。

    我还没有很多,如果Maven和Eclipse有任何问题。意识到Maven并不神奇。而且,如果你打算使用Maven和Eclipse,那么一切都必须由POM文件驱动,而不是反过来。然后,事情工作很好。

    只是为了重新澄清,您的问题与Maven无关。您正在类路径中声明两次资源。你需要重新考虑你的单元测试。有些事情可以通过配置文件来解决这个问题,但是这是对构建系统的滥用。

    +0

    我同意你对使用这些工具的观点(“一切都必须由POM文件驱动”),而不是滥用构建系统。我正在努力按规则行事。但是,似乎不能依赖_tooling_来设置测试运行的阶段。 *测试本身*必须具备智能*知道*使用哪种资源。我欢迎您提供关于如何配置单元测试来加载一个但不是另一个相同名称的资源文件的建议。 –

    +1

    @SriSankaran问题不是Maven问题。在类路径的两个确切位置上有两个确切的资源。没有阶级装载机,这是一个糟糕的设计。你能否用你正试图解决的具体用例来更新你的问题?我确信有一个更好的解决方案,试图将两个完全相同的资源放在类路径中。 –

    +0

    我已更新帖子 –

    0

    我回答了,然后不得不花了很长时间试图找出答案。 在万无一失的文档,它说,测试类应先在类路径: http://maven.apache.org/surefire/maven-surefire-plugin/examples/configuring-classpath.html

    而且万无一失显示(与MVN --debug选项): [DEBUG]测试类路径:
    ... \目标\测试类
    ... \ target \ classes .... m2 \ repository \ javax \ enterprise \ cdi-api \ 1.2 \ cdi-api-1.2.jar
    .... m2 \ repository \ javax \ el \ javax.el-api \ 3.0.0 \ javax.el-api-3.0.0.jar ... 但是stil它首先使用target \ classes。前段时间有人报告奇怪这个bug。 然后,无论我做什么从classes文件夹的persistence.xml首先采取。

    所以我不得不在一个persistence.xml文件中使用两个持久单元,可能不是最好的,但也可以正常工作。