控制器测试中的Grails 4.0模拟服务方法
Grails 4.0 Mock service method in controller test
我有一个这样的控制器:
class NotificationApiController {
def countService
def getCount() {
def results = countService.getCount()
render results as JSON
}
}
控制器测试如下:
Closure doWithSpring() {{ ->
countService(CountService)
}}
CountService countService
def setup() {
}
def cleanup() {
}
void "test getCount method"() {
given:
def countService = Mock(CountService) {
1 * getCount(_) >> [count: 2]
}
when:
def y = controller.getCount()
then:
y == [count: 2]
}
它似乎总是调用在 Closure doWithSpring() 中注入的实际 CountService,而不是我的模拟 countService,但如果没有 Closure doWithSpring() 的定义...,我会收到此错误
Cannot invoke method getCount() on null object
java.lang.NullPointerException: Cannot invoke method getCount() on null object
4.0 中关于单元测试的文档真的很有限,我不确定我应该怎么做。我在 Grails 2.3 或 3.3 中看到了一些示例。版本,但它们似乎都不适合我,我猜主要是由于 Spock 和 Mixin 框架的差异。有关如何执行此操作的任何建议?
您省略了一些可能影响推荐的细节,但 https://github.com/jeffbrown/chrisjiunittest 的项目显示了解决此问题的一种方法。
package chrisjiunittest
import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification
class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {
void "test something"() {
setup:
// whether or not this is the right thing to do
// depends on some other factors, but this is
// an example of one approach...
controller.countService = Mock(CountService) {
getCount() >> [count: 2]
}
when:
controller.getCount()
then:
response.json == [count: 2]
}
}
另一个选项:
package chrisjiunittest
import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification
class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {
Closure doWithSpring() {
// whether or not this is the right thing to do
// depends on some other factors, but this is
// an example of one approach...
{ ->
countService MockCountService
}
}
void "test something"() {
when:
controller.getCount()
then:
response.json == [count: 2]
}
}
class MockCountService {
Map getCount() {
[count: 2]
}
}
我有一个这样的控制器:
class NotificationApiController {
def countService
def getCount() {
def results = countService.getCount()
render results as JSON
}
}
控制器测试如下:
Closure doWithSpring() {{ ->
countService(CountService)
}}
CountService countService
def setup() {
}
def cleanup() {
}
void "test getCount method"() {
given:
def countService = Mock(CountService) {
1 * getCount(_) >> [count: 2]
}
when:
def y = controller.getCount()
then:
y == [count: 2]
}
它似乎总是调用在 Closure doWithSpring() 中注入的实际 CountService,而不是我的模拟 countService,但如果没有 Closure doWithSpring() 的定义...,我会收到此错误
Cannot invoke method getCount() on null object
java.lang.NullPointerException: Cannot invoke method getCount() on null object
4.0 中关于单元测试的文档真的很有限,我不确定我应该怎么做。我在 Grails 2.3 或 3.3 中看到了一些示例。版本,但它们似乎都不适合我,我猜主要是由于 Spock 和 Mixin 框架的差异。有关如何执行此操作的任何建议?
您省略了一些可能影响推荐的细节,但 https://github.com/jeffbrown/chrisjiunittest 的项目显示了解决此问题的一种方法。
package chrisjiunittest
import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification
class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {
void "test something"() {
setup:
// whether or not this is the right thing to do
// depends on some other factors, but this is
// an example of one approach...
controller.countService = Mock(CountService) {
getCount() >> [count: 2]
}
when:
controller.getCount()
then:
response.json == [count: 2]
}
}
另一个选项:
package chrisjiunittest
import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification
class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {
Closure doWithSpring() {
// whether or not this is the right thing to do
// depends on some other factors, but this is
// an example of one approach...
{ ->
countService MockCountService
}
}
void "test something"() {
when:
controller.getCount()
then:
response.json == [count: 2]
}
}
class MockCountService {
Map getCount() {
[count: 2]
}
}