簡體   English   中英

如何對使用文件鎖的java方法進行單元測試?

[英]How to unit test my java method which uses file locks?

假設我有以下代碼:

public boolean canLock(Path path) throws IOException {
    try(FileChannel byteChannel = FileChannel.open(path);
        FileLock lock = byteChannel.tryLock()) {
        return lock != null;
    }
}

當然,這段代碼沒有用,只是在這里說明了盡可能緊湊的問題。

現在,我要對該方法進行單元測試:如果文件被另一個進程鎖定,我想測試結果是否為false。 與此類似:

public void canLock_returnsFalse_ifFileIsLocked() {
  // setup
  Path tmpPath = createTmpPath();
  FileLock lock = lock(tmpPath);

  // execution
  boolean actual = canLock(tmpPath);

  // evaluation
  assertFalse(actual);
}

現在出現問題了: 文檔說:

如果由於另一個程序持有重疊的鎖而無法獲取鎖,則[tryLock()]返回null

拋出OverlappingFileLockException-如果此Java虛擬機已經持有與請求區域重疊的鎖,或者該方法已經阻止了另一個線程並試圖鎖定同一文件的重疊區域

這意味着,如果鎖是由我自己的進程創建的,則行為會大為不同,因此我的單元測試有問題。 如何以一種單元測試通常可以接受的方式(便攜式,可靠,快速,簡單)從其他過程創建鎖。

似乎您需要使用JMockit或PowerMock模擬對FileChannel.open的調用,以便它返回模擬的FileChannel。

JMockit模擬靜態方法

考慮到您要測試canLock(...) 在這種情況下,您只需模擬FileChannel。 請參考此以獲取Mockito示例: http ://www.vogella.com/tutorials/Mockito/article.html

已更新:在上述情況下,首選使用JMockit(由John B回答),因為它需要模擬Mockito中不存在的靜態API。 但是Mockito值得學習:)

暫無
暫無

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

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