2016-04-18 6 views
0

Grailsプロジェクト用のJunitテストケースを作成しています。Grailsのスポークは、特定のクラスのメソッドをモック/スタブする方法です。

ここでは、テストケースを書くためにSpockフレームワークを使用しています。

ここでは、以下のメソッドをテストしようとしています。

しかし、私はモック/スタブ残りの。ポストメソッド。私は実際の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 
} 

どのようにして特定のクラスのメソッドをモック/スタブするのですか?

答えて

1

あなたはcreateRestBuilderよう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) 
} 
+2

とサービスを定義したり、工場Beanを作成春に注射される。これにより、テスト中のクラスに対してSpyを使用することが回避されます。 – loteq

関連する問題