[英]Why Can't I access src/test/resources in Junit test run with Maven?
我在運行以下代碼時遇到問題:
configService.setMainConfig("src/test/resources/MainConfig.xml");
來自Junit @Before方法。
這是Maven構建其目標文件夾的方式嗎?
直接訪問MainConfig.xml
。 src/test/resources
目錄內容放在CLASSPATH的根目錄中。
更准確地說: src/test/resources
被復制到target/test-classes
,所以如果你有以下項目結構:
.
└── src
└── test
├── java
│ └── foo
│ └── C.java
└── resources
├── a.xml
└── foo
└── b.xml
它將導致以下測試CLASSPATH內容:
/foo/C.class
/a.xml
/foo/b.xml
要從Java源實際訪問文件,請使用getClass().getResource("/MainConfig.xml").getFile()
。
我想setMainConfig
需要一個資源的路徑,它將使用ClassLoader加載,而不是相對文件路徑。 如果你鏈接到這個神秘的configService.setMainConfig
方法的javadoc會有所幫助。
如果我的猜測是正確的,那么路徑應該只是MainConfig.xml。 Mave將src/test/resources
的內容復制到target/test-classes
(IIRC)文件夾。 此test-classes文件夾位於單元測試的類路徑中。
我今天遇到了同樣的問題,我找到了一些解決方案。
首先,這是我的文件結構:
.
└── src
│ └── test
│ ├── java
│ │ └── mypackage
│ │ └── MyClassTest.java
│ └── resources
│ └── image.jpg
└── target
└── test-classes
├── image.jpg
└── mypackage
└── MyClassTest.class
什么不起作用: (Java 11 synthax)
var imgFile = new File("image.jpg"); // I was expecting that Junit could find the file.
var absPath = file.getAbsolutePath(); // /home/<user>/../<project-root>/image.jpg
var anyFileUnderThisPath = file.exists(); // false
我們可以注意到的是, 絕對路徑並沒有指向我的圖像! 但是如果我在項目根目錄下有一個圖像,那么它就可以了。
解決方案1:路徑 (在Java 7中引入)
var relPath = Paths.get("src", "test", "resources", "image.jpg"); // src/test/resources/image.jgp
var absPath = relPath.toFile().getAbsolutePath(); // /home/<user>/../<project-root>/src/test/resources/image.jpg
var anyFileUnderThisPath = new File(absPath).exists(); // true
我們可以看到,它指向正確的文件。
解決方案2:ClassLoader
var classLoader = getClass().getClassLoader();
var url = classLoader.getResource("image.jpg"); // file:/home/<user>/../<project-root>/target/test-classes/image.jpg
var file = new File(url.getFile()); // /home/<user>/../<project-root>/target/test-classes/image.jpg
var anyFileUnderThisPath = file.exists(); // true
請注意,現在在目標目錄下搜索文件! 它的工作原理。
解決方案3:文件 (適應非工作示例)
var absPath = new File("src/test/resources/image.jpg").getAbsolutePath();
var var anyFileUnderThisPath = new File(absPath).exists(); // true
在獲取絕對路徑並將src/test/resources/
作為前綴后也可以使用。
摘要
所有這三個解決方案都可以工作但是不得不放src/test/resources/
,在我看來並不優雅,這就是為什么我更喜歡第二個解決方案( ClassLoader
)。
資料來源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.