【发布时间】:2023-04-09 02:04:01
【问题描述】:
我有一个非常简单的单元测试,用于测试将当前用户呈现为 JSON 的控制器操作。这是我的测试类:
@TestFor(UserController)
class UserControllerSpec extends Specification {
def setup() {
def springSecurityService = mockFor(SpringSecurityService)
springSecurityService.demand.getCurrentUser { -> [name: "Jim"] }
controller.springSecurityService = springSecurityService.createMock()
}
def cleanup() {
}
void "test current"() {
when:
request.method = 'GET'
controller.current()
then:
response.json.name == "Jim"
}
}
这里是控制器(省略无关代码)
def springSecurityService
static responseFormats = ['json']
static allowedMethods = [current: "GET"]
def current() {
respond(springSecurityService.currentUser)
}
我正在通过grails test -unit package.class 单独执行此测试,它通过命令行运行:
|Running 1 unit test... 1 of 1
|Completed 1 unit test, 0 failed in 0m 11s
.
|Tests PASSED - view reports in ...\target\test-reports
这不适用于 IntelliJ,因为 springSecurityService.currentUser 始终为空。这是产生的异常:
org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error parsing JSON
at grails.converters.JSON.parse(JSON.java:292)
at org.codehaus.groovy.grails.plugins.testing.AbstractGrailsMockHttpServletResponse.getJson(AbstractGrailsMockHttpServletResponse.groovy:97)
at massemailsystem.UserControllerSpec.test current(UserControllerSpec.groovy:28)
Caused by: org.codehaus.groovy.grails.web.json.JSONException: Missing value. at character 0 of
at org.codehaus.groovy.grails.web.json.JSONTokener.syntaxError(JSONTokener.java:470)
at org.codehaus.groovy.grails.web.json.JSONTokener.nextValue(JSONTokener.java:357)
at grails.converters.JSON.parse(JSON.java:283)
... 2 more
有什么想法吗?
【问题讨论】:
-
在您的设置中,您配置了
getCurrentUser,但您的代码调用了currentUser。除非这里发生了什么事情,否则这可能是潜在的罪魁祸首。 -
@Lilshieste 在 groovy 中,
getCurrentUser是从currentUser调用的
标签: unit-testing grails intellij-idea spock intellij-13