簡體   English   中英

為什么我不能在使用Maven的Junit測試運行中訪問src / test / resources?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM