JUnit 5 test with a field annotated as `@RegisterExtension` doesn't work in Kotlin

Viewed 2229

I have a JUnit 5 test class written in Java that uses a field annotated as @RegisterExtension, and it works just fine:

class RegisterExtensionTest {

    @RegisterExtension
    LoggingExtension log = new LoggingExtension(RegisterExtensionTest.class);

    @Test void demoTest() {
        ...
    }
}

When I convert it to Kotlin:

class RegisterExtensionTest {

     @RegisterExtension
     var log = LoggingExtension(RegisterExtensionTest::class.java)

     @Test
     fun demoTest() {
        ...
    }
}

Now the LoggingExtension doesn't run any more. Why?

1 Answers

As documented here, just add a @JvmField annotation to the field, and it works.

class RegisterExtensionTest {

     @JvmField
     @RegisterExtension
     var log = LoggingExtension(RegisterExtensionTest::class.java)

     @Test
     fun demoTest() {
        ...
    }
}

The extension field has to be public (and JUnit doesn't warn you if it isn't), but in Kotlin, a property creates a private field and a getter in the byte code, so JUnit doesn't see it.

Related