Интеграционное тестирование приложения Jooby с использованием Spock

У меня есть довольно простое приложение, которое использует Jooby в качестве веб-фреймворка. Его класс, ответственный за REST, выглядит так

class Sandbox : Kooby ({
    path("/sandbox") {
        get {
            val environment = require(Config::class).getString("application.env")
            "Current environment: $environment"
        }

        get ("/:name") {
            val name = param("name")
            "Auto response $name"
        }
    }
})

Я хочу написать интеграционный тест для него. Мой тест выглядит следующим образом. я использую spock а также rest-assured, Дело в том, что у меня нет запущенного приложения, и я хочу запустить его с использованием какого-либо встроенного сервера или чего-то еще. Как это сделать?

Мой простой тест выглядит так

class SandboxTest extends Specification {

    def "check current environment"() {
        given:
            def request = given()
        when:
            def response = request.when().get("/sandbox")
        then:
            response.then().statusCode(200) // for now 404
    }
}

1 ответ

Вам нужно искать до / после теста (или класса) хуки в Споке. В хуке before вы запускаете Jooby без блокировки потока:

app.start("server.join=false")

в после крюка:

app.stop();

Никогда не использовал Spock, но вот небольшой метод расширения для Spek:

fun SpecBody.jooby(app: Jooby, body: SpecBody.() -> Unit) {
  beforeGroup {
    app.start("server.join=false")
  }

  body()

  afterGroup {
    app.stop()
  }
}

Наконец из вашего теста:

@RunWith(JUnitPlatform::class)
object AppTest : Spek({
  jooby(App()) {
    describe("Get with query parameter") {
        given("queryParameter name=Kotlin") {
            it("should return Hello Kotlin!") {
                val name = "Kotlin"
                given()
                        .queryParam("name", name)
                        .`when`()
                        .get("/")
                        .then()
                        .assertThat()
                        .statusCode(Status.OK.value())
                        .extract()
                        .asString()
                        .let {
                            assertEquals(it, "Hello $name!")
                        }
            }
         ...
      ...
   ...
...

Пример Maven Spek

Пример Gradle Spek

Другие вопросы по тегам