spock - 模拟静态方法不起作用

时间:2016-04-26 13:56:08

标签: java unit-testing groovy spock

我正在尝试使用groovy的a = 1988 a[2] = TypeError str(a)[2] = '8' # yey 约定来模拟静态方法readAttributes,但是会调用真正的方法。

这就是我嘲笑静态函数的方法:

metaClass

我在这里做错了吗?

我的java方法

def "test"() {
    File file = fold.newFile('file.txt')
    Files.metaClass.static.readAttributes = { path, cls ->
        null
    }

    when:
        fileUtil.fileCreationTime(file)
    then:
        1 * fileUtil.LOG.debug('null attribute')
}

3 个答案:

答案 0 :(得分:3)

简短的回答是,这是不可能的,请查看this问题。

如果有:

  • 测试中的代码是用groovy编写的
  • 模拟(已更改)类必须在groovy代码中实例化。

解决方法是提取将属性返回给另一个类的逻辑,该类将被模拟而不是直接使用Files

答案 1 :(得分:3)

我使用一级间接解决了这个问题。我创建了一个test class的实例方法,它就像这个静态调用的包装器一样。

public BasicFileAttributes readAttrs(File file) throws IOException {
    return Files.readAttributes(file.toPath(), BasicFileAttributes.class);
}

从测试中我模拟了实例方法。

FileUtil util = Spy(FileUtil);
util.readAttrs(file) >> { null }

解决了我的问题。

答案 2 :(得分:0)

您可以为此使用GroovySpy,如spock documentation

所述

在您的情况下,它将是:

def filesClass = GroovySpy(Files, global: true)
filesClass.readAttributes(*_) >> null