簡體   English   中英

Junit + getResourceAsStream 返回 Null

[英]Junit + getResourceAsStream Returning Null

不知道這怎么可能。 我重新閱讀了 getResourceAsStream,它總是返回 null。

InputStream source = this.getClass().getResourceAsStream("test.xml");

Finder 中 test.java 旁邊(使用 OS X 和 Eclipse)是 test.xml

我可以在 TextWrangler 中打開它並查看它是否存在內部數據。

如果它有任何區別,這是一個 Junit 測試。 我去查看了我們系統上現有的 Junit 測試,我以與工作示例完全相同的方式使用它(如文件所在的位置和代碼本身)。

有什么微小的差異會阻止我假設 getClass() 返回正確的路徑?

謝謝!

它沒有在類路徑上找到資源。 如果您使用的是 junit 和 maven,請確保通過在<testResource>部分添加<include>文件指令將資源復制到目標/測試類

您還可以使用以下命令找出您的類在文件系統中的位置

this.getClass().getResource(".")

並檢查資源是否存在

getResourceAsStream()正在使用 CLASSPATH,因此它將從您的類所在的任何位置加載,而不是您的源文件。

我懷疑您需要將 XML 復制到與 .class 文件相同的目錄中。

如果您使用 Maven,請將這部分添加到您的pom.xml

<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>

您的test.xml和其他資源文件必須位於src/test/resources

我總是對這種方法有問題。 這里有 2 個鏈接,可能有用:

我總是嘗試在開頭添加“/”或“./”。

根據我的經驗,最好的方法是使用 FileInputStream。 只需要記住一件事(在 Eclipse 中使用 FileInputStream 時),在默認設置下,您的工作目錄設置為項目根目錄。 您始終可以使用這段代碼檢查當前目錄在哪里(以及您需要什么相對路徑)。

假設test.xml位於您的test根源文件夾下,請執行以下操作:-

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");

我在這個問題上花了很多時間,但缺少以下配置:右鍵單擊 eclipse 項目並選擇Properties -> Java Build Path -> Source並編輯Included行並添加 *.properties (*.fileExtension)

將 test.xml 放在 src/main/resources(或 src/test/resources)中。

File file = ResourceUtils.getFile("classpath:test.xml");
String test = new String(Files.readAllBytes(file.toPath()));

嘗試使用類加載器

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");

來自 Java API:

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getSystemResource(java.lang.String)

從用於加載類的搜索路徑中查找指定名稱的資源。 該方法通過系統類加載器定位資源

例如,語法將是: ClassLoader.getSystemResource("test.xml").toString();

奇跡般有效!

試試 MyClass.getResourceAsStream()。

還可以嘗試將 test.xml 放在您的類路徑中。 例如,在 Eclipse Web 項目中,將 text.xml 放在 webcontent/WEB-INF/classes

我在 Spring 課程中遇到了這個問題。 System.class.getResourceAsStream(...)在單元測試中工作但不在 Tomcat 中, Thread.currentThread().getContextClassLoader().getResourceAsStream(...)在 Tomcat 中工作但不在單元測試中。

最終我去了:

ClassUtils.getDefaultClassLoader()
    .getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))

我還發現,一旦我這樣做了,我也必要都開始以斜線的路徑。

您需要將資源文件的副本放入測試資源中,在我的示例中它是字體文件:

在此處輸入圖片說明

然后從您的 jUnit 測試中調用 next:

 public static InputStream getFontAsStream() throws IOException {
        return Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("fonts/" + "FreeSans.ttf");
    }

將您的資源文件所在的文件夾添加到 eclipse 的源文件夾中。 然后文件應該自動放到bin目錄下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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