Grails spock - как имитировать/заглушить определенный метод класса

Я пишу тестовые примеры Junit для проекта Grails.

Здесь я использую платформу Spock для написания тестовых случаев.

Здесь я пытаюсь проверить следующий метод.

Но я хочу смоделировать/заглушить метод rest.post. Я не хочу называть фактический URL-адрес.

 def RestResponse restPost(String url, Map headerMap, Map jsonDataMap) {
    RestBuilder rest = new RestBuilder()
    RestResponse response = rest.post(url) {
        headerMap.each { k, v -> header(k, v) }
        header('contentType', 'application/json')
        header('Accept-API-Version', 'resource=2.0,protocol=1.0')
        if (jsonDataMap)
            json(jsonDataMap)
    }
    response
}

Я пробовал с MockFor. Он вызывает фактический URL.

   void "test restPost"() {
    setup:
    RestResponse resMock = new RestResponse()
    def httpBuildMock = new MockFor(RestBuilder)
    httpBuildMock.demand.post(_) >>  resMock

    when:
    def url = "http://testme"
    def headerMap = [
            'Authorization': 'Basic ' + 'encodedStr'
    ]
    def dataMap = [
            'operation': 'replace',
            'field'    : 'userPassword',
            'value'    : 'devicePassword'
    ]
    RestResponse res = service.restPost(url, headerMap, dataMap)

    then:
    res
}

Итак, как смоделировать/заглушить определенный метод класса?


person PShetty    schedule 18.04.2016    source источник


Ответы (1)


Вы можете создать отдельный метод для создания RestBuilder, чтобы создатьRestBuilder, а затем возвращать макет каждый раз, когда этот метод вызывается:

   def RestResponse restPost(String url, Map headerMap, Map jsonDataMap) {
    RestBuilder rest = createRestBuilder()
    RestResponse response = rest.post(url) {
        headerMap.each { k, v -> header(k, v) }
        header('contentType', 'application/json')
        header('Accept-API-Version', 'resource=2.0,protocol=1.0')
        if (jsonDataMap)
            json(jsonDataMap)
    }
    response
}

затем определите службу с

def service = Spy(ServiceClass) {
  // stub a call on the same object
  createRestBuilder() >> Mock(RestBuilder)
}
person devnoo    schedule 18.04.2016
comment
Или создайте Фабричный компонент, введенный Spring. Это позволяет избежать использования Spy для вашего тестируемого класса. - person Luis Muñiz; 18.04.2016