Ktor:使用 Spek/KotlinTest 代替 JUnit 测试 Class 测试 REST 端点
Ktor: testing REST endpoints using Spek/KotlinTest instad of JUnit Test Class
我有一个简单的 hello world Ktor 应用程序:
fun Application.testMe() {
intercept(ApplicationCallPipeline.Call) {
if (call.request.uri == "/")
call.respondText("Hello")
}
}
使用 JUnit 测试 class 我可以为它编写测试,如其文档中所述;如下:
class ApplicationTest {
@Test fun testRequest() = withTestApplication(Application::testMe) {
with(handleRequest(HttpMethod.Get, "/")) {
assertEquals(HttpStatusCode.OK, response.status())
assertEquals("Hello", response.content)
}
with(handleRequest(HttpMethod.Get, "/index.html")) {
assertFalse(requestHandled)
}
}
}
但是,我想在 Spek 或 KotlinTest 中做一个单元测试,没有 JUnit 的帮助,类似于我在 ScalaTest/Play 中做的方式;以更明确的方式:
- 在测试期间向路由发送 FakeRequest(即
/
)。
- 获取页面内容,检查字符串"hello"。
问题是我可以在 KotlinTest 或 Spek 中以更具声明性的方式编写上述测试吗?
首先关注spek setup guide with JUnit 5
然后你可以像下面这样简单地声明你的规格
object HelloApplicationSpec: Spek({
given("an application") {
val engine = TestApplicationEngine(createTestEnvironment())
engine.start(wait = false) // for now we can't eliminate it
engine.application.main() // our main module function
with(engine) {
on("index") {
it("should return Hello World") {
handleRequest(HttpMethod.Get, "/").let { call ->
assertEquals("Hello, World!", call.response.content)
}
}
it("should return 404 on POST") {
handleRequest(HttpMethod.Post, "/", {
body = "HTTP post body"
}).let { call ->
assertFalse(call.requestHandled)
}
}
}
}
}
})
这是我的build.gradle(简体)
buildscript {
dependencies {
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
}
repositories {
jcenter()
}
}
repositories {
jcenter()
maven { url "http://dl.bintray.com/jetbrains/spek" }
}
apply plugin: 'org.junit.platform.gradle.plugin'
junitPlatform {
filters {
engines {
include 'spek'
}
}
}
dependencies {
testCompile 'org.jetbrains.spek:spek-api:1.1.5'
testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
testCompile "io.ktor:ktor-server-test-host:$ktor_version"
}
我有一个简单的 hello world Ktor 应用程序:
fun Application.testMe() {
intercept(ApplicationCallPipeline.Call) {
if (call.request.uri == "/")
call.respondText("Hello")
}
}
使用 JUnit 测试 class 我可以为它编写测试,如其文档中所述;如下:
class ApplicationTest {
@Test fun testRequest() = withTestApplication(Application::testMe) {
with(handleRequest(HttpMethod.Get, "/")) {
assertEquals(HttpStatusCode.OK, response.status())
assertEquals("Hello", response.content)
}
with(handleRequest(HttpMethod.Get, "/index.html")) {
assertFalse(requestHandled)
}
}
}
但是,我想在 Spek 或 KotlinTest 中做一个单元测试,没有 JUnit 的帮助,类似于我在 ScalaTest/Play 中做的方式;以更明确的方式:
- 在测试期间向路由发送 FakeRequest(即
/
)。 - 获取页面内容,检查字符串"hello"。
问题是我可以在 KotlinTest 或 Spek 中以更具声明性的方式编写上述测试吗?
首先关注spek setup guide with JUnit 5
然后你可以像下面这样简单地声明你的规格
object HelloApplicationSpec: Spek({
given("an application") {
val engine = TestApplicationEngine(createTestEnvironment())
engine.start(wait = false) // for now we can't eliminate it
engine.application.main() // our main module function
with(engine) {
on("index") {
it("should return Hello World") {
handleRequest(HttpMethod.Get, "/").let { call ->
assertEquals("Hello, World!", call.response.content)
}
}
it("should return 404 on POST") {
handleRequest(HttpMethod.Post, "/", {
body = "HTTP post body"
}).let { call ->
assertFalse(call.requestHandled)
}
}
}
}
}
})
这是我的build.gradle(简体)
buildscript {
dependencies {
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
}
repositories {
jcenter()
}
}
repositories {
jcenter()
maven { url "http://dl.bintray.com/jetbrains/spek" }
}
apply plugin: 'org.junit.platform.gradle.plugin'
junitPlatform {
filters {
engines {
include 'spek'
}
}
}
dependencies {
testCompile 'org.jetbrains.spek:spek-api:1.1.5'
testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
testCompile "io.ktor:ktor-server-test-host:$ktor_version"
}