У нас довольно стандартная 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, но по возможности хотел бы этого избежать.