Только перехожу с Java на Kotlin. Возник вопрос, ответ на который, к сожалению, я не смог найти.
Существует некий абстрактный класс с несколькими абстрактными переменными, на который потом будут ложиться десятки тестов. Тестирую с помощью JUnit. Методы аннотированные @BeforeClass и @AfterClass обязаны быть статичными, и я вижу только один способ разрешения пробелемы: запихнуть методы внутрь companion object, где можно использовать @JvmStatic, но при этом, в методе @BeforeClass вызывается абстрактная переменная, задаваемая каждой реализацией отдельно. Соответсвенно, каким образом можно обратиться к переменной из внешнего класса? Или может быть есть другой способ разрешения такой задачи? Код:
abstract class TemplateConfig {
abstract val template : String?
companion object {
lateinit var h: Handle
@BeforeClass
@JvmStatic
fun setUp() {
h = dbi.value.open()
//Здесь используется абстрактная переменная
//
//if (template != null) {
// h.createStatement(template).execute()
//}
}
@AfterClass
@JvmStatic
fun tearDown() {
h.close()
}
//{...Объявление и инициализация других переменных...}
}
}
Ответ
Если я правильно понял, вы пытаетесь в статическом методе обратиться к нестатической переменной/методу которая задается в классе потомке. Так не выйдет. Единственное решение, которое я вижу, это определить поле статическим и при инициализации класса-потомка задать ему значение.
object Demo {
protected var value:String
@BeforeClass
fun setUp() {
println(value)
}
@AfterClass
fun destroy() {
}
}
internal class SubClass:Demo() {
companion object {
init {
Demo.value = "this is value"
}
}
}
Комментариев нет:
Отправить комментарий