我们有一个相当标准的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)
这就是注释在JUnit5扩展中的使用方式:
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,但如果可能的话,希望避免这种情况。
注释只是缺少@Inherited。它们是在类上找到的,但如果没有@Inherited,它们就无法通过超类找到。