8

型で拡張関数をテストしたい場合は、この型のインスタンスを作成し、関数を呼び出して戻り値を確認できます。しかし、クラス内で定義された拡張関数のテストについてはどうでしょうか?

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つの可能性がありました:

  1. 拡張機能を使用しないでください。¯\_(ツ)_/¯

    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()て戻り値を確認できます。

  2. internalロジックをテストするためだけに、可視性を備えた追加の拡張関数を作成します。

    class SubClass1: AbstractClass<Int>() {
        override fun String.foo(): Int = internalFoo()
    }
    
    internal fun String.internalFoo(): Int = 1
    

    次に、オブジェクトを作成しString、呼び出しinternalFoo()て戻り値を確認できます。override fun String.foo(): Intただし、本体を変更してテストに合格する可能性があるため、このソリューションは好きではありません。

では、クラス内で拡張機能をテストすることは可能ですか? そうでない場合、ロジックをテストするためにどのように設計を変更しますか?

4

2 に答える 2