簡體   English   中英

單元測試Controller - MissingMethodException時無法模擬Grails服務方法

[英]Unable to mock Grails Service method when unit testing Controller - MissingMethodException

在測試控制器時收到以下錯誤消息 - 請參閱下面的代碼。 我怎么能糾正這個? 當我從控制器(run-app)調用服務方法時,它工作正常。

例外:

groovy.lang.MissingMethodException:沒有方法簽名:grails.test.GrailsMock.isOk()適用於參數類型:(java.lang.String)值:[H] at ... VControllerSpec.test something(VControllerSpec.groovy) :)

class: VControllerSpec

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(VController)
@Mock(VService)
class VControllerSpec extends Specification {

    void "test something"() {
        given:
        def vServiceMock = mockFor(VService)
        vServiceMock.demand.isOk { String yeah -> return true }
        controller.vService = vServiceMock.createMock()

        when:
        def isO = vServiceMock.isOk("H") 

        then:
        isO == true     
    }
}

class: VService

import grails.transaction.Transactional

@Transactional
class VService {
    def isOk = { String yeah ->     
        def isO = false
        return isO
    }
}

謝謝,史蒂夫

假設VController有一個動作:

def myAction() {
    vService.isOk('Hello')
}

以下測試應該通過

void 'test service'() {
    given:
    def vServiceMock = mockFor(FormatService)
    vServiceMock.demand.isOk { String yeah -> return true }
    controller.vService = vServiceMock.createMock()

    when:
    def isO = controller.myAction() 

    then:
    isO == true
}

這里有一些優化的事情包括使用方法isOk而不是閉包作為最佳實踐。

人們不會期望測試一種被嘲笑的方法。 當我們模擬一個方法時,我們只是假設它的實現是正確的並且已經過測試(在其他一些單元測試中)。 模擬的目的是將我們的測試重點限制在有限的代碼行(通常是一種方法),在您的情況下是您的控制器操作。 所以上面的測試用例可以寫成:

假設你的行動是這樣的:

def myAction(){
 [iso: vServiceMock.isOk()] // assuming isOk returns boolean true
}

void "test myAction"() {
        given:
        def vServiceMock = mockFor(VService)
        vServiceMock.demand.isOk { String yeah -> return true }
        controller.vService = vServiceMock.createMock()

        when:
        def model = controller.myAction() 

        then:
        model.iso   //you can skip comparison with true 
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM