【问题标题】:Grails spock- how to mock/stub a particular method of classGrails spock-如何模拟/存根类的特定方法
【发布时间】:2016-04-18 15:01:31
【问题描述】:

我正在为 Grails 项目编写 Junit 测试用例。

这里我使用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
}

那么如何模拟/存根类的特定方法?

【问题讨论】:

    标签: grails groovy mocking spock


    【解决方案1】:

    您可以创建一个单独的方法来创建 RestBuilder 以便 createRestBuilder 然后在每次调用此方法时返回一个模拟:

       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)
    }
    

    【讨论】:

    • 或者,创建一个spring注入的Factory bean。这样可以避免在您的测试类中使用 Spy。
    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2015-02-11
    • 1970-01-01
    • 2013-03-10
    • 2018-01-09
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多