Spock заглушка не работает в методе Feature - PullRequest
1 голос
/ 30 апреля 2019

Я пишу юнит-тест, используя спок.При создании тестового примера я высмеиваю объекты и заглушаю вызовы функций ответом.Но когда вызовы-заглушки выполняются в подчиненном классе / классе обслуживания, методы-заглушки возвращают нулевое значение вместо фактического значения.Если я попытаюсь получить доступ к значению-заглушке в тестовом классе, я смогу получить к нему доступ, но в классе-заглушке оно возвращает нулевое значение для моей заглушки.

Ниже приведен пример, который я выполняю

class Test extends Specification{
    def ServiceClass = new ServiceClass()
    def "test doSomething method"(){
        given:
        String id = "id"
        def cacheService = Mock(CacheService)
        def obj = Mock(CacheObj)
        cacheService.get(_) >> obj
        obj.getValue("thisID") >> "test"  //stubbing this to return test
        when:
        //calling dosomething() method of service class
        cacheService.doSomething(id)
        then:
        //checking assertions here
    }
}


class ServiceClass{
    public String doSomething(String id){
        Object obj = cacheService.get(id);
        String val = obj.getValue("thisID") // while executing this, val is returning **null**, but it should ideally return "test" as it is stubbed in specification class
    }
}

Ожидаемый ответ: " test ", но он возвращает значение NULL. Это место, где я объявляю заглушки неправильными?Потому что, если я объявлю это в методе setupSpec (), все будет работать как положено.

1 Ответ

0 голосов
/ 23 июня 2019

Вы должны передать каким-то образом смоделированный CacheService в ServiceClass.

Один из возможных вариантов теста:

class ServiceClassTest extends Specification {
    def "doSomething(String) should return a value of cached object"() {
        given: "some id"
        def id = "id"

        and: "mocked cached object which returns 'test' value"
        def obj = Mock(CacheObj)
        obj.getValue("thisID") >> "test"

        and: "mocked cached service which returns the cached object by given id"
        def cacheService = Mock(CacheService)
        cacheService.get(id) >> obj

        and: "a main service with injected the mocked cache service"
        def serviceClass = new ServiceClass(cacheService)

        expect:
        serviceClass.doSomething(id) == "test
    }
}

ServiceClass имеет соответствующий конструктор дляпередать кеш-сервис:

class ServiceClass {
    private final CacheService cacheService;

    ServiceClass(CacheService cacheService) {
       this.cacheService = cacheService;
    }

    ...
}
...