假设我有以下代码:
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 --如果与请求区域重叠的锁已被此虚拟机持有,或者如果另一个线程已在此方法中被阻塞,并试图锁定同一文件的重叠区域,则抛出
这意味着,如果锁是由我自己的进程创建的,并且因此我的单元测试有一个问题,那么这个行为就会有很大的不同。如何从不同的过程中创建一个锁,这种方式对于单元测试来说是可以接受的(可移植的、可靠的、快速的、简单的)。
发布于 2014-11-24 16:27:06
似乎您需要使用JMockit或PowerMock来模拟对FileChannel.open的调用,以便它返回一个模拟的FileChannel。
JMockit模拟静态法
发布于 2014-11-24 16:28:33
考虑到您想测试canLock(...)。在这种情况下,您只需模拟FileChannel。请参考下面的Mockito示例:http://www.vogella.com/tutorials/Mockito/article.html
更新:在上面的场景中,最好使用JMockit (由John回答),因为它是模拟Mockito中不存在的静态API所必需的。然而,Mockito值得学习:)
https://stackoverflow.com/questions/27109365
复制相似问题