【问题标题】:Spock Test, only check if method is called and do not execute itSpock Test,只检查方法是否被调用,不执行
【发布时间】:2014-03-27 08:31:22
【问题描述】:

在我们的 Spock 测试中,我们想要检查是否选择了我们软件中的正确路径。但是我们不想测试被调用方法的功能(这是在单独的测试中完成的)

def "Test"() {
    setup:
    service.metaClass.innerMethod = { -> return null }

    when:
    service.doSomething("notexisting@test.com")

    then:
    1 * service.innerMethod(*_)
}

这个测试总是失败,因为innerMethod中的代码被调用并且innerMethod中方法调用的调用被计算在内,而不是方法innerMethod的调用被计算在内

|  Too few invocations for:
    1 * service.innerMethod(*_)   (0 invocations)

Unmatched invocations (ordered by similarity):

    1 * secondService.doSomething()

我怎样才能调用 innerMethod 并模拟整个函数?

【问题讨论】:

    标签: grails testing spock


    【解决方案1】:

    如果你不是在模拟服务本身,你需要做这样的事情(注意在使用 metaClass 时传递正确的参数:

    def "Test"() {
        setup:
            def calls = 0
            service.metaClass.innerMethod = { p1 -> calls++ }
        when:
            service.doSomething("notexisting@test.com")
        then:
            calls==1
    }
    

    如果你在模拟服务,

    def "Test"() {  
        when:
            service.doSomething("notexisting@test.com")
        then:
            1 * service.innerMethod(_)
    }
    

    【讨论】:

    • 感谢您的提示。我们将使用第一种方法,因为服务调用在同一个服务中,因此不会被模拟。
    • 我尝试做 metaClass 的事情,直到我添加了参数类型,它才起作用,就像这样:service.metaClass.innerMethod = { SomeClass p1 -> calls++ }
    • 是的,这很正常,使用元类属性覆盖方法时,签名应该完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多