型で拡張関数をテストしたい場合は、この型のインスタンスを作成し、関数を呼び出して戻り値を確認できます。しかし、クラス内で定義された拡張関数のテストについてはどうでしょうか?
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
ますか? それは可能ですか?
デザインを変更してテストできることはわかっています。私には2つの可能性がありました:
拡張機能を使用しないでください。¯\_(ツ)_/¯
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
ただし、本体を変更してテストに合格する可能性があるため、このソリューションは好きではありません。
では、クラス内で拡張機能をテストすることは可能ですか? そうでない場合、ロジックをテストするためにどのように設計を変更しますか?