[英]how to mock a service method inside a controller for unit testing in grails using JUnit and when to use mockController
[英]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.