В идеале, если вы используете инфраструктуру внедрения зависимостей (например, Dagger), вы бы хотели, чтобы тестовые классы просто вставляли Environment
(что позволило бы ссылаться на путь среды только после его предоставления), например:
class TestClass {
@Inject lateinit var environment: Environment
private lateinit var path: String
@Before fun setup() {
// do injection here
path = environment.path
}
}
В противном случае, я думаю, что делегирование интерфейса может быть хорошим вариантом здесь и полностью исключает рефлексию.Например, создайте EnvironmentHost
, который отображает свойства environment
и path
:
interface EnvironmentHost {
var environment: Environment
val path: String
}
Создайте здесь реализацию для тестовых классов:
class TestEnvironmentHost : EnvironmentHost {
override var environment: Environment = generateEnvironment("jUnit")
override val path: String
get() = environment.path
}
Тестовые классы теперь могутвыглядеть так:
class TestClass : EnvironmentHost by TestEnvironmentHost() {
@Test fun myTest() {
val myPath = path
val myEnvironment = environment
}
}
И ваш тестовый завод может быть упрощен до:
@TestFactory
fun generateTests(): List<DynamicTests> = classList.flatMap { testClass ->
val instance = testClass.createInstance()
// Assign an environment if the test is an EnvironmentHost. If not,
// you could choose to treat that as a failure and require the test
// class to be an EnvironmentHost.
(instance as? EnvironmentHost)?.environment = postgresEnv
...
}