我试图单元(而不是集成)测试一段我无法改变的遗留代码:
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
}
我无法弄清楚如何进入内部模拟
尝试这样的事情:
@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 Values和Performing Side Effects部分找到。另外,请注意我通过将Job.getId()
字段添加到id
类来使Job
工作。我不确定它是如何在你的代码中实现的
findByJobIdAndParam需要2个参数:
status = StatusObj.findByJobIdAndParam(getId(), param)
你的存根需要1个arg:
StatusObj.findByJobIdAndParam(_) >> 2
尝试更改存根:
StatusObj.findByJobIdAndParam(_, _) >> 2