2011-07-29 22 views
0

我的單元測試之一是由測試數據驅動的,存儲在src/test/resources/testData.txt中。由於Maven會將src/test/resources的內容複製到類路徑上的target/test-classes/,我可以方便地從類路徑中讀取該文件,而不必關心它的絕對文件名。到現在爲止還挺好。有沒有一種便捷的方式來獲取Maven項目中的資源路徑?

現在我正在討論一些代碼,這些代碼會使用從遠程系統獲取的數據更新該文件。該代碼將很少運行,而不是作爲構建的一部分。更新的文件將被提交到源存儲庫。爲了追加到文件中,我需要知道src/test/resources中原始文件的路徑(附加到target/test-classes/中的那個顯然不起作用)。

如何以便攜方式確定路徑?我寧願不編碼src/test/resources/,因爲這些目錄名稱可能實際上會改變。此外,如果使用除我的項目基目錄以外的當前工作目錄執行,則會中斷。

任何想法?

回答

2

最好的辦法可能是${project.basedir}/src/test/resources。測試資源目錄不太可能發生變化,無論您的工作目錄如何,它都會安全地解析到正確的路徑。嘗試通過屬性引用測試資源目錄是有問題的,因爲可以定義多個測試資源並且通常是多個測試資源。你怎麼知道選哪一個?

+0

不知道我是否理解正確。 '$ {project.basedir}/src/test/resources'會很好,但是如何從我的代碼中解析'$ {project.basedir}'的值? –

+1

通常情況下,你需要在你的測試中加入一個屬性文件,如'myFile.path = $ {project.basedir}/src/test ...',你可以[過濾屬性](http:/ /maven.apache.org/plugins/maven-resources-plugin/examples/filter.html),獲取由maven插入的正確路徑。 –

+0

謝謝瑞安,這是對我的問題非常合理的解決方案。但是,這意味着除了POM之外,還要維護一個包含構建配置的單獨文件,如果可能的話,我想盡量避免這些文件。受到你的建議的啓發,我發現了一個我個人更喜歡的不同解決方案,我將在下面發佈一個答案。 –

0

我的首選解決方案是配置surefire插件,在測試執行期間將${project.basedir}作爲環境變量公開。如果需要,單元測試可以從環境中讀取該信息。這使得在POM所有的配置,將不需要改變應該是路徑不斷改變:

<build> 
    <plugins> 
     ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      ... 
      <configuration> 
       ... 
       <environmentVariables> 
        <maven.project.basedir>${project.basedir}</maven.project.basedir> 
       </environmentVariables> 
      </configuration> 
     </plugin> 
     ... 
    </plugins> 
</build> 

其它的解決方案可以使用資源過濾(由瑞安的建議),或者通過配置萬無一失的插件來實現增加${project.basedir}/src/test/resources/到類路徑。

+0

爲了澄清,我在答案中提出的建議仍然可以保留POM中的所有配置。它只是使用相當標準的屬性文件將其公開給測試。無論您的屬性文件是否具有任何實際值,還是完全由maven屬性佔位符組成,都由您決定。屬性文件的主要特點是它作爲一種配置方法在Java框架中相當普遍。任何可以讀取屬性文件。 –

相關問題