2012-07-01 106 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文件中使用兩個持久單元,可能不是最好的,但也可以正常工作。