4

このコードを考えると:

// Subject.kt

open class Subject(var x: Int) {

    constructor(): this(42) {
        println("made it")
    }

    fun doit() {
        x += 1
        println("did it: $x")
    }
}
// Tests.kt

import org.junit.jupiter.api.Test
import org.mockito.Mockito

class Tests {
    @Test
    fun makeit() {
        val mock = Mockito.mock(Subject::class.java)

        val details = Mockito.mockingDetails(mock)
        println("Is mock: ${details.isMock}")
        println("Is spy:  ${details.isSpy}")

        mock.doit()
        mock.doit()
    }
}

を実行するmakeitと、出力は次のようになります。

Is mock: true
Is spy:  false
did it: 1
did it: 2

これは、サブジェクトのいくつかのインスタンスが作成されているが、潜在的に重要なコンストラクター ロジックをバイパスしていることを示しているようです。これは「部分的なモック」と一致していますが、コードはそのようなことを要求するために何もしていません。

ドキュメントはすべて部分モックの使用に対して強く警告しているため、これがデフォルトの動作であることは驚くべきことです。いつ部分モックを返すかを説明するドキュメントを見つけることができなかったためmock()、クラスから「完全なモック」を取得する方法がわかりません。

そう:

  • はいつMockito.mock()部分モックを作成しますか?
  • Mockito はクラスの「完全なモック」を作成できますか? それともインターフェースのためだけですか?
  • 「完全なモック」をリクエストするにはどうすればよいですか?
4

1 に答える 1