Kotlin аннотаций, определенных в тестах, не присутствующих в информации отражения в интеграционных тестах - PullRequest
0 голосов
/ 14 июля 2020

У нас довольно стандартная Kotlin сборка DSL Gradle. Мы добавили набор источника интеграционного теста и задачу:

plugins {
    kotlin("jvm") version "1.3.72"
    application
}

sourceSets {
    create("integrationTest") {
        compileClasspath += sourceSets.main.get().output
        runtimeClasspath += sourceSets.main.get().output
        compileClasspath += sourceSets.test.get().output
        compileClasspath += sourceSets.main.get().runtimeClasspath
        runtimeClasspath += sourceSets.test.get().output
        resources.srcDir(sourceSets.test.get().resources.srcDirs)
    }
}

val integrationTest = task<Test>("integrationTest") {
    description = "Runs the integration tests."
    group = "verification"
    testClassesDirs = sourceSets["integrationTest"].output.classesDirs
    classpath = sourceSets["integrationTest"].runtimeClasspath
    mustRunAfter(tasks.test)
    useJUnitPlatform()
}

Классы в src/integrationTest/kotlin могут нормально использовать классы из src/test/kotlin, но аннотации, определенные в src/test/kotlin, не отображаются в данных отражения для классов в src/integrationTest/kotlin. При использовании в классах в src/test/kotlin аннотации присутствуют в данных отражения, как и ожидалось.

Аннотации очень просты:

@Target(FUNCTION, CLASS)
// NB: Default Retention is RUNTIME (Annotation is stored in binary output and visible for reflection)
annotation class SystemProperty(val key: String, val value: String)

// Kotlin does not yet support repeatable annotations https://youtrack.jetbrains.com/issue/KT-12794
@Target(FUNCTION, CLASS)
annotation class SystemProperties(vararg val systemProperties: SystemProperty)

Вот как аннотации используются в Расширение JUnit 5:

class SystemPropertyExtension : BeforeAllCallback {
    override fun beforeAll(extensionContext: ExtensionContext) {
        val clazz = extensionContext.requiredTestClass
        clazz.getAnnotation(SystemProperty::class.java)?.let {
            System.setProperty(it.key, it.value)
        }
        clazz.getAnnotation(SystemProperties::class.java)?.let {
            it.systemProperties.forEach { prop -> System.setProperty(prop.key, prop.value) }
        }
    }
}

И типичное использование в самом тесте:

@SystemProperty(key = "aws.s3.endpoint", value = "http://localstack:4566")
@ExtendWith(SystemPropertyExtension::class)
class SomeIntegrationTest {
    //
}

Установка точек останова во время выполнения тестов показывает, что System.setProperty(it.key, it.value) вызывается. Однако во время отладки интеграционных тестов точка останова не срабатывает.

Есть идеи, что здесь может быть неправильным / отсутствующим?

Мы могли бы добавить в проект модуль «тестирования» и экспортировать тест -jar, но по возможности хотел бы этого избежать.

1 Ответ

0 голосов
/ 14 июля 2020

Аннотации просто отсутствовали @Inherited. Они были найдены в классах, но без @Inherited они не были найдены через суперкласс.

...