Как макетировать статические замыкания в Groovy / Grails - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь выполнить модульное (не интеграционное) тестирование фрагмента устаревшего кода, который я не могу изменить:

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 голосов
/ 23 февраля 2019

findByJobIdAndParam принимает 2 аргумента:

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

Ваша заглушка занимает 1 аргумент:

StatusObj.findByJobIdAndParam(_) >> 2

Попробуйте изменить заглушку следующим образом:

StatusObj.findByJobIdAndParam(_, _) >> 2
0 голосов
/ 23 февраля 2019

Попробуйте что-то вроде этого:

@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.Также обратите внимание, что я заставил Job.getId() работать, добавив поле id в класс Job.Я не уверен, как это реализовано в вашем коде

...