我正在尝试对我无法更改的遗留代码进行单元测试(而不是集成):
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
}
我不知道如何进入内部模拟
答案 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 Values和Performing Side Effects部分中找到它的工作方式。另外,请注意,我通过向Job.getId()
类添加id
字段来使Job
起作用。我不确定您的代码中是如何实现的
答案 1 :(得分:1)
findByJobIdAndParam 需要2个参数:
status = StatusObj.findByJobIdAndParam(getId(), param)
您的存根带有1个arg:
StatusObj.findByJobIdAndParam(_) >> 2
尝试像这样更改存根:
StatusObj.findByJobIdAndParam(_, _) >> 2