簡體   English   中英

關於Java模擬文件的建議(模擬java.io.File)

[英]Suggestions for a java Mock File (to mock java.io.File)

有人對Java模擬File對象有建議嗎? 我正在使用需要獲取java.io.File對象作為參數的第三方類。 我通過網絡服務(也是其產品之一)以流的形式接收此文件的數據。

一種解決方案是將所有這些數據寫入文件,並將其提供給類。 這是我不喜歡的解決方案:它剝奪了使用Web服務的優勢,而不僅僅是下載文件。

更快,更有效的方法是將內存中的數據放入模擬文件中,並將該模擬文件提供給第三方類。

它可能必須是MockFile,它擴展了java.io.File並覆蓋了與硬盤上的文件進行實際接口的所有功能。

我知道第三方應該使用流而不是文件作為輸入參數。 但是,這超出了我的影響。

這只是基於我對您問題的理解所提出的建議。 我相信,你一定在做這樣的事情,

public void doSomething(){
      //Pre processing
       Object result=new ThirdPartyCode().actualMethod(file);
     //Post processing
}

從單元測試的角度來看,模擬對象更有意義。 您的目標不是單元測試第三方庫函數,而是單元測試doSomething()方法。 因此,您可以圍繞第三方函數創建包裝器。也許像這樣,

public class Wrapper implements MyWrapper{

   public Object invokeThirdPartyFunction(File file){
      new ThirdPartyCode().actualMethod(file);
   }
}

現在,您可以創建一個模擬包裝器(實現相同的接口),並將此模擬包裝器用於所有junit案例。

被測試的類僅查詢模擬文件的名稱,屬性等,還是實際嘗試打開文件?

在前一種情況下,您可以使用EasyMock或等效的模擬框架輕松創建模擬。

后一種情況比較棘手,而且恐怕如果輸入流是由類在內部創建的,除了在HD上實際創建真實的測試文件之外,您別無選擇。

您可以使用基於ASM的類加載器加載第3方代碼,該類加載器將java.io.File映射到您自己的“偽”實現。 這是一項工作,需要仔細執行...例如,您還需要映射FileInputStream等。

您不使用文件(或單元測試中的任何外部依賴項)。 除了使用模擬之外,您的方法還會導致有問題的測試。 有關更多信息,請參見此Javaranch文章

暫無
暫無

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

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