首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对使用文件锁的java方法进行单元测试?

如何对使用文件锁的java方法进行单元测试?
EN

Stack Overflow用户
提问于 2014-11-24 16:21:47
回答 2查看 1.8K关注 0票数 1

假设我有以下代码:

代码语言:javascript
复制
public boolean canLock(Path path) throws IOException {
    try(FileChannel byteChannel = FileChannel.open(path);
        FileLock lock = byteChannel.tryLock()) {
        return lock != null;
    }
}

当然,这段代码有点无用,它只是为了尽可能简洁地说明这个问题。

现在,我想对这个方法进行单元测试:如果文件被另一个进程锁定,我想测试结果是否为false。与此类似的东西:

代码语言:javascript
复制
public void canLock_returnsFalse_ifFileIsLocked() {
  // setup
  Path tmpPath = createTmpPath();
  FileLock lock = lock(tmpPath);
  
  // execution
  boolean actual = canLock(tmpPath);
  
  // evaluation
  assertFalse(actual);
}

现在出现了一个问题:文档说:

如果由于另一个程序持有重叠锁而无法获得锁,则tryLock()返回null

抛出OverlappingFileLockException --如果与请求区域重叠的锁已被此虚拟机持有,或者如果另一个线程已在此方法中被阻塞,并试图锁定同一文件的重叠区域,则抛出

这意味着,如果锁是由我自己的进程创建的,并且因此我的单元测试有一个问题,那么这个行为就会有很大的不同。如何从不同的过程中创建一个锁,这种方式对于单元测试来说是可以接受的(可移植的、可靠的、快速的、简单的)。

EN

回答 2

Stack Overflow用户

发布于 2014-11-24 16:27:06

似乎您需要使用JMockit或PowerMock来模拟对FileChannel.open的调用,以便它返回一个模拟的FileChannel。

JMockit模拟静态法

票数 1
EN

Stack Overflow用户

发布于 2014-11-24 16:28:33

考虑到您想测试canLock(...)。在这种情况下,您只需模拟FileChannel。请参考下面的Mockito示例:http://www.vogella.com/tutorials/Mockito/article.html

更新:在上面的场景中,最好使用JMockit (由John回答),因为它是模拟Mockito中不存在的静态API所必需的。然而,Mockito值得学习:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27109365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档