2012-02-01 1 views
7

나는 쓰려고하는 서비스에 대한 테스트 케이스를 작성하는 방법을 알아 내려고하고있다.그루비 HTTPBuilder 응답을 조롱

서비스는 HTTPBuilder를 사용하여 일부 URL에서 응답을 요청합니다. HTTPBuilder 요청은 성공 또는 실패에 대한 응답 만 확인하면됩니다.

boolean isOk() { 
    httpBuilder.request(GET) { 
     response.success = { return true } 
     response.failure = { return false } 
    } 
} 

그래서, 나는 내가 주장 할 수 내 테스트에 성공/실패가 될하기 위해 내가 응답을 설정할 수 있도록 HTTPBuilder을 조롱 할 수 있도록하려면 : 서비스 구현으로 간단하게 뭔가를 할 것 내 서비스의 isOk 메서드는 응답이 성공한 경우 True를 반환하고 실패한 경우 False를 반환합니다.

내가 HTTPBuilder 요청을 조롱하고 GroovyTestCase에서 응답을 설정하는 방법에 대한 도움을받을 수 있습니까? result 필드가 true 인 경우

class MockHttpBuilder { 
    def result 
    def requestDelegate = [response: [:]] 

    def request(Method method, Closure body) { 
     body.delegate = requestDelegate 
     body.call() 
     if (result) 
      requestDelegate.response.success() 
     else 
      requestDelegate.response.failure() 
    } 
} 

, 그것은 그렇지 않으면 failuresuccess 폐쇄를 호출 할 수 있습니다 :

답변

10

다음은 테스트 케이스를 처리하는 모의 HttpBuilder의 최소한의 예입니다.

편집 : 답장을

import groovy.mock.interceptor.MockFor 

def requestDelegate = [response: [:]] 
def mock = new MockFor(HttpBuilder) 
mock.demand.request { Method method, Closure body -> 
    body.delegate = requestDelegate 
    body.call() 
    requestDelegate.response.success() // or failure depending on what's being tested 
} 
mock.use { 
    assert isOk() == true 
} 
+0

감사 : 여기에 대신 모의 클래스의 MockFor를 사용하는 예제가있다. '결과'를 true/false로 설정하는 것이 무엇인지 이해하지 못합니다. 또한 모의 (Mock)보다 스텁 (Stub)과 같은 것이 아닌가? – C0deAttack

+0

테스트를 설정할 때 직접 결과를 설정해야합니다. 예 : '새로운 MockHttpBuilder (결과 : true)'. 그루비 조롱을 사용하는 대안을 추가했습니다. – ataylor

+0

Ataylor의 응답이 좋았습니다. 응답 상태를 직접 설정 한 다음이를 사용하여 매핑에서 올바른 종료를 실행한다는 점을 제외하고는 거의 동일한 구현이있었습니다. 그러나 이것은 정말로 Stub 조롱입니다. 정확한 접근 방식은 응답을 제공하는 클라이언트를 조롱하는 것이라고 생각합니다. – Gepsens