提问者:小点点

@BeforeClass在ktor测试类中不工作


我有一个ktor服务器,我正在尝试进行单元测试。然而,我找不到好的留档,我无法让它工作,我可能错过了一些东西,但我现在卡住了,它没有给出任何错误,但我不认为它在运行服务器。

import io.ktor.http.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.server.testing.*
import com.protecto.authorization.*
import com.typesafe.config.ConfigFactory
import io.ktor.client.*
import io.ktor.server.application.*
import io.ktor.server.config.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import org.junit.BeforeClass
import org.junit.Test
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.MethodOrderer
import org.junit.jupiter.api.TestMethodOrder


@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
class ApplicationTest {
    private lateinit var client: HttpClient

    companion object {
        val engine = TestApplicationEngine(createTestEnvironment {
            config = HoconApplicationConfig(ConfigFactory.load("application.conf"))
        })

        @BeforeClass
        @JvmStatic
        fun setup() {
            println("TESTING IS READY TO BEGIN!")
            engine.start(wait = false)
            engine.application.module()
        }
    }

    @BeforeEach
    fun init() {
        client = HttpClient()
    }

    @AfterEach
    fun cleanup() {
        client.close()
    }

    @Test
    fun testSomething() = with(engine) {
        with(handleRequest(HttpMethod.Get, "/")) {
            assertEquals(HttpStatusCode.OK, this.response.status())
        }
    }
}

我只能说打印没有发生。

我想要的是运行服务器,然后执行测试。这是我现在所拥有的。断言为空且失败,没有有价值的日志:


共1个答案

匿名用户

您正在混合Junit4Junit5注释。Junit5的正确注释是@BeforeAll

import org.junit.jupiter.api.BeforeAll

class ApplicationTest {
    companion object {
        @BeforeAll
        @JvmStatic
        fun setup() {
            println("We have all mixed Junit4 and Junit5 annotations by accident in the past.")
        }
    }
}

旧的(JUnit4)@BeforeClass和新的(JUnit5)@BeforeAll相似之处在于它们都只执行一次,在类中的任何测试之前。因此,即使您的类有10个测试,@BeforeAll方法也只会执行一次。

有关差异的更多详细信息,请参阅:stackoverflow.com/a/48137060/5037430