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

时间:2019-02-22 16:58:59

标签: grails groovy gorm spock

我正在尝试对我无法更改的遗留代码进行单元测试(而不是集成):

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

这是我尝试对它进行存根的操作:

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


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

我不知道如何进入内部模拟

2 个答案:

答案 0 :(得分: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 :(得分:1)

findByJobIdAndParam 需要2个参数:

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

您的存根带有1个arg:

StatusObj.findByJobIdAndParam(_) >> 2

尝试像这样更改存根:

StatusObj.findByJobIdAndParam(_, _) >> 2