用spock测试void的简单方法

问题描述 投票:-1回答:2

我需要测试以下方法:

class Person {

    String getFileName(String number) {
         return "file"+number
    }

    void updateSpec(String number) {
         new File(getFileName(number)).delete()
    }
}

我尝试像这样创建测试用例:

def "update spec"() {
        given:
            Person person = new Person()

        when:
            person.updateSpec('1')

        then:
            1 * File.delete()
    }

它说:

Too few invocations for:

1 * File.delete()   (0 invocations)

有什么问题以及如何解决它,谢谢!

有没有一种很好的方法来测试这种方法?

groovy spock
2个回答
1
投票

取决于你想要测试什么。首先,您必须使用Mock或Spy来测试调用计数。

例如,您可以测试是否从getFileName()方法调用updateSpec()方法,以及是否使用'1'参数调用它,如下所示:

def "update spec"() {
    given:
    Person person = Spy(Person)

    when:
    person.updateSpec('1')

    then:
    1 * person.getFileName('1')
}

如果你真的需要测试File.delete()是否被调用,那么最好将Person类改为一点,因为你需要File mock来检查调用计数:

class Person {
    File getFile(String number) {
        return new File("file" + number)
    }

    void updateSpec(String number) {
        getFile(number).delete()
    }
}

然后测试可以:

def "File delete was called"() {
    given:
    File file = Mock(File)
    Person person = Spy(Person)
    person.getFile(_) >> file

    when:
    person.updateSpec('1')

    then:
    1 * file.delete()
}

另一个选择是注入一些FileService,它将封装File.delete()方法,进入Person类并测试它上面的发票。


1
投票

您只能定义规范下的对象与其模拟的依赖项之间的交互。但是,在您的示例中,您正在“指定”与File类的交互,而不是模拟对象。看Spock的Interaction Based Testing。从技术上讲,您可以按照@cgrim回答中的建议实现/改变目标。或者你可以使用PowerMock(没有Spock)之类的工具来模拟除了REMEMBER之外的所有东西,这种技术应该只作为最后的手段。基本上,如果您坚持最佳设计实践,那么您将永远不需要这样的工具。除非你必须处理一些遗留代码

© www.soinside.com 2019 - 2024. All rights reserved.