Как программно запустить ktor-сервер для Интеграционных Тестов? - PullRequest
0 голосов
/ 16 апреля 2020

KTor хорошо работает с модульными тестами, но как мне запустить сервер ktor для интеграционных тестов?

Вот так выглядит мой тест:

@ExperimentalCoroutinesApi
class HttpClientTest {
    private val logger = LoggerFactory.getLogger(HttpClientTest::class.java.name)

    companion object {

        @BeforeClass
        @JvmStatic
        fun setup() {
            // ?????
        }

        @AfterClass
        @JvmStatic
        fun teardown() {
            // ????
        }
    }


    @Test
    fun testMitDefaultHttpClient() {
        val httpget = HttpGet("http://0.0.0.0:8080/json/gson")
        httpget.setHeader("Accept", "application/json")
        httpget.setHeader("Content-Type", "application/json")

        val httpclient: HttpClient = HttpClients.createDefault()
        val response = httpclient.execute(httpget)

        Assert.assertEquals(200, response.statusLine.statusCode.toLong())

        val responseString = EntityUtils.toString(response.entity)
        logger.info(responseString)
    }
}

1 Ответ

1 голос
/ 16 апреля 2020

ОК - найдено решение:

package at.mikemitterer.catshostel.routes

import at.mikemitterer.catshostel.WsClientApp.main
import at.mikemitterer.catshostel.main
import io.ktor.application.Application
import io.ktor.application.call
import io.ktor.http.ContentType
import io.ktor.response.respondText
import io.ktor.routing.get
import io.ktor.routing.routing
import io.ktor.server.engine.applicationEngineEnvironment
import io.ktor.server.engine.connector
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import io.ktor.server.netty.NettyApplicationEngine
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest
import org.apache.http.client.HttpClient
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils
import org.junit.*
import org.koin.test.KoinTest
import org.slf4j.LoggerFactory


@ExperimentalCoroutinesApi
class HttpClientTest : KoinTest {
    private val logger = LoggerFactory.getLogger(HttpClientTest::class.java.name)


    companion object {
        lateinit var server: NettyApplicationEngine

        @BeforeClass
        @JvmStatic
        fun setup() {
            val env = applicationEngineEnvironment {
                module {
                    main(true)
                }
                // Public API
                connector {
                    host = "0.0.0.0"
                    port = 8080
                }
            }
            server = embeddedServer(Netty, env).start(false)
        }

        @AfterClass
        @JvmStatic
        fun teardown() {
            // clean up after this class, leave nothing dirty behind
            server.stop(1000, 10000)
        }
    }


    @Test
    fun testMitDefaultHttpClient() {
        val httpget = HttpGet("http://0.0.0.0:8080/json/gson")
        httpget.setHeader("Accept", "application/json")
        httpget.setHeader("Content-Type", "application/json")

        val httpclient: HttpClient = HttpClients.createDefault()
        val response = httpclient.execute(httpget)

        Assert.assertEquals(200, response.statusLine.statusCode.toLong())

        val responseString = EntityUtils.toString(response.entity)
        logger.info(responseString)
    }
}

...