如何在Groovy / Grails中模拟静态闭包

问题描述 投票:0回答:2

我试图单元(而不是集成)测试一段我无法改变的遗留代码:

class Job {
 public boolean isStale(String param) {
     def status
     StatusObj.withTransaction {
        status = StatusObj.findByJobIdAndParam(getId(), param)
     }
     return status
 }
}

这是我尝试Stub it:

 def  () {
        setup:        
        GroovySpy(StatusObj, global: true)       
        StatusObj.withTransaction(_) >> StatusObj
        StatusObj.findByJobIdAndParam(_,_) >> 2


        when:
        def isStale = job.isStale("test")
        then:
        isStale == 2
    }

我无法弄清楚如何进入内部模拟

grails groovy gorm spock
2个回答
2
投票

尝试这样的事情:

@Unroll
class JobSpec extends Specification {
    def "spec"() {
        when:
        GroovySpy(StatusObj, global: true)
        def job = new Job(id: "ID")
        def param = "test"
        1 * StatusObj.withTransaction(_) >> { Closure action ->
            action.call()
        }
        1 * StatusObj.findByJobIdAndParam(job.id, param) >> status

        then:
        job.isStale(param) == isStale

        where:
        status | isStale
        0      | false
        1      | true
        2      | true
    }
}

在这里action是来自status = StatusObj.findByJobIdAndParam(getId(), param)类的你的Job。它的工作原理可以在Spock文档的Computing Return ValuesPerforming Side Effects部分找到。另外,请注意我通过将Job.getId()字段添加到id类来使Job工作。我不确定它是如何在你的代码中实现的


1
投票

findByJobIdAndParam需要2个参数:

status = StatusObj.findByJobIdAndParam(getId(), param)

你的存根需要1个arg:

StatusObj.findByJobIdAndParam(_) >> 2

尝试更改存根:

StatusObj.findByJobIdAndParam(_, _) >> 2
© www.soinside.com 2019 - 2024. All rights reserved.