Kotlin使用JUnit 5的@BeforeAll和@AfterAll

时间:2021-12-28 18:13:00

Java版本JUnit5 @BeforeAll和@AfterAll的用法可以参考此文

Kotlin的类是没有静态方法的,如果要提供类似于Java的静态方法,可以使用伴生对象(companion object)语法。

应用于所有实例的@BeforeAll和@AfterAll

把Java版静态方法的JUnit 5 @BeforeAll和@AfterAll使用Kotlin的伴生对象语法转换如下:

import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.slf4j.LoggerFactory

class Junit5KotlinTest {

    @Test
    fun aTest1() {
        LOGGER.info("aTest1 called")
        LOGGER.info(this.toString())
    }

    @Test
    fun aTest2() {
        LOGGER.info("aTest2 called")
        LOGGER.info(this.toString())
    }

    companion object {
        private val LOGGER = LoggerFactory.getLogger(Junit5KotlinTest::class.java)

        @BeforeAll
        @JvmStatic
        internal fun beforeAll() {
            LOGGER.info("beforeAll called")
        }

        @AfterAll
        @JvmStatic
        internal fun afterAll() {
            LOGGER.info("afterAll called")
        }
    }
}

这里使用了@JvmStatic注释用来标记@BeforeAll和@AfterAll注释的方法是等同于JVM的静态方法。@BeforeAll注释的方法会在所有实例的所有测试用例之前调用。@AfterAll注释的方法会在所有实例的所有测试用例之后调用。

应用于实例的@BeforeAll和@AfterAll

应用在实例方法上那就简单点了,Java版的转换如下:

import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.slf4j.LoggerFactory

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class Junit5KotlinTest {

    private val LOGGER = LoggerFactory.getLogger(Junit5KotlinTest::class.java)

    @BeforeAll
    internal fun beforeAll() {
        LOGGER.info("beforeAll called")
    }

    @Test
    fun aTest1() {
        LOGGER.info("aTest1 called")
        LOGGER.info(this.toString())
    }

    @Test
    fun aTest2() {
        LOGGER.info("aTest2 called")
        LOGGER.info(this.toString())
    }


    @AfterAll
    internal fun afterAll() {
        LOGGER.info("afterAll called")
    }
}