Если мы хотим протестировать функцию расширения для типа, мы можем создать экземпляр этого типа, вызвать функцию и проверить возвращаемое значение.Но как насчет тестирования функций расширения, определенных внутри классов?
abstract class AbstractClass<T> {
fun doStuff(): T = "Hello".foo()
abstract fun String.foo(): T
}
class SubClass1: AbstractClass<Int>() {
override fun String.foo(): Int = 1
}
class SubClass2: AbstractClass<Boolean>() {
override fun String.foo(): Boolean = true
}
Как мы можем проверить логику методов foo()
в классах SubClass1
и SubClass2
?Это вообще возможно?
Я знаю, что могу изменить дизайн, чтобы протестировать его.Мне пришло в голову две возможности:
Не использовать функции расширения.¯ \ _ (ツ) _ / ¯
abstract class AbstractClass<T> {
fun doStuff(): T = foo("Hello")
abstract fun foo(string: String): T
}
class SubClass1: AbstractClass<Int>() {
override fun foo(string: String): Int = 1
}
Затем мы можем создать объект SubClass1
, вызвать foo()
и проверить возвращаемое значение.
Создайте дополнительные функции расширения с видимостью internal
только для проверки логики.
class SubClass1: AbstractClass<Int>() {
override fun String.foo(): Int = internalFoo()
}
internal fun String.internalFoo(): Int = 1
Затем мы можем создать объект String
, вызвать internalFoo()
и проверить возвращаемое значение.Однако мне не нравится это решение, потому что мы могли бы изменить тело override fun String.foo(): Int
, и наш тест прошел бы.
Итак, возможно ли тестировать функции расширения внутриклассы ?Если нет, как бы вы изменили свой дизайн, чтобы проверить их логику?