Spock & Spring 引导集成测试
Spock & Spring Boot Integration Test
我有一个 spring boot 1.5.1.RELEASE 项目使用 Spock 1.1 进行集成测试。我有一个基本控制器:
@RestController("/words")
public class WordsController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public ResponseEntity getAllWords() {
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("Your list of words go here");
}
}
我正在尝试使用以下方法测试端点:
@ContextConfiguration(classes = MyApplication.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class WordsControllerTest extends Specification {
RESTClient restClient = new RESTClient("http://localhost:3000", ContentType.JSON)
def "test the GET endpoint is available"() {
when:
def response = restClient.get(
path: '/words',
requestContentType: JSON
)
then:
response.status == 200
}
这是我的主应用程序 class:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
但是当我 运行 这个时,我得到了一个非常奇怪的错误:
groovyx.net.http.RESTClient : Error parsing
'application/json' response
groovy.json.JsonException: Unable to determine the current character,
it is not a string, number, array, or object
The current character read is 'Y' with an int value of 89 Unable to
determine the current character, it is not a string, number, array, or
object line number 1 index number 0 Your list of words go
here��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
^ at
groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:206)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.json.internal.JsonParserCharArray.decodeValue(JsonParserCharArray.java:157)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.json.internal.JsonParserCharArray.decodeFromChars(JsonParserCharArray.java:46)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.json.internal.JsonParserCharArray.parse(JsonParserCharArray.java:384)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:128)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.json.JsonSlurper.parse(JsonSlurper.java:221)
~[groovy-all-2.4.7.jar:2.4.7] at
groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280)
~[http-builder-0.7.1.jar:na] at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.8.0_40] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
~[na:1.8.0_40] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.8.0_40] at java.lang.reflect.Method.invoke(Method.java:497)
~[na:1.8.0_40] at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1215)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1082)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.Closure.call(Closure.java:414)
~[groovy-all-2.4.7.jar:2.4.7] at
groovy.lang.Closure.call(Closure.java:430)
~[groovy-all-2.4.7.jar:2.4.7]
不确定这是否有影响,但这是我的 gradle 文件的一部分:
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-devtools')
compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
runtime('com.h2database:h2')
compile group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.7.1'
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.1-groovy-2.4-rc-2')
testCompile('org.spockframework:spock-spring:1.1-groovy-2.4-rc-2')
testCompile "org.hamcrest:hamcrest-core:1.2"
我不确定为什么 JSON 没有被正确发送或接收。
将您的端点标记为 returning application/json
媒体类型是不够的。您还需要return有效JSON内容其中:
"Your list of words go here"
不是。
如果你需要return一个列表写:
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("{\"words\": [\"one\", \"two\"]}");
或普通消息:
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("{\"msg\": \"content\"");
Spring 可以自动将 POJO 映射到 JSON 负载,看看 @ResponseBody
我有一个 spring boot 1.5.1.RELEASE 项目使用 Spock 1.1 进行集成测试。我有一个基本控制器:
@RestController("/words")
public class WordsController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public ResponseEntity getAllWords() {
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("Your list of words go here");
}
}
我正在尝试使用以下方法测试端点:
@ContextConfiguration(classes = MyApplication.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class WordsControllerTest extends Specification {
RESTClient restClient = new RESTClient("http://localhost:3000", ContentType.JSON)
def "test the GET endpoint is available"() {
when:
def response = restClient.get(
path: '/words',
requestContentType: JSON
)
then:
response.status == 200
}
这是我的主应用程序 class:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
但是当我 运行 这个时,我得到了一个非常奇怪的错误:
groovyx.net.http.RESTClient : Error parsing 'application/json' response
groovy.json.JsonException: Unable to determine the current character, it is not a string, number, array, or object
The current character read is 'Y' with an int value of 89 Unable to determine the current character, it is not a string, number, array, or object line number 1 index number 0 Your list of words go here�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ^ at groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:206) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.json.internal.JsonParserCharArray.decodeValue(JsonParserCharArray.java:157) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.json.internal.JsonParserCharArray.decodeFromChars(JsonParserCharArray.java:46) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.json.internal.JsonParserCharArray.parse(JsonParserCharArray.java:384) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:128) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.json.JsonSlurper.parse(JsonSlurper.java:221) ~[groovy-all-2.4.7.jar:2.4.7] at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280) ~[http-builder-0.7.1.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_40] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_40] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_40] at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_40] at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1215) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1082) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.Closure.call(Closure.java:414) ~[groovy-all-2.4.7.jar:2.4.7] at groovy.lang.Closure.call(Closure.java:430) ~[groovy-all-2.4.7.jar:2.4.7]
不确定这是否有影响,但这是我的 gradle 文件的一部分:
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-devtools')
compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
runtime('com.h2database:h2')
compile group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.7.1'
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.1-groovy-2.4-rc-2')
testCompile('org.spockframework:spock-spring:1.1-groovy-2.4-rc-2')
testCompile "org.hamcrest:hamcrest-core:1.2"
我不确定为什么 JSON 没有被正确发送或接收。
将您的端点标记为 returning application/json
媒体类型是不够的。您还需要return有效JSON内容其中:
"Your list of words go here"
不是。
如果你需要return一个列表写:
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("{\"words\": [\"one\", \"two\"]}");
或普通消息:
return ResponseEntity
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body("{\"msg\": \"content\"");
Spring 可以自动将 POJO 映射到 JSON 负载,看看 @ResponseBody