2

私は次の構造を持っています

public class A{...}

public class B extends A{
    private C cObject;
    private Object otherValue;

    B(){
       cObject = new C(this);
    }
}

public class C{
    private B bObject;

    C(B bObject){
       this.bObject = bObject;
    }
}

クラス B のメソッドをテストしたいです。テストしたいメソッドをテストするために B の別のメソッドをモックする必要があるため、mockito を使用しています。したがって、私のテストでは、 B オブジェクトを として宣言し、@Spy呼び出しMockitoAnnotations.initMocks(this);て、最後にメソッドをモックしますdoReturn().when().method();

テストを実行すると失敗します。デバッグして驚いたのは、オブジェクト B にいるとき、フィールドの値がotherValueたとえばXであるのに、C にいるとき、 の値が ではthis.bObject.otherValueないことに気付いたことです。Xnull

を使用して B 内にオブジェクト C を作成したのでnew C(this);、 B と C.bObject の両方が同じオブジェクトであり、したがって同じ値を含むべきではありませんか?

:オブジェクトをスパイせずにメソッドをモックすることもせずに試してみましたが、機能するので、本当の問題は次のとおりです。

オブジェクトをスパイすると、Mockito はオブジェクトを別のオブジェクトに置き換えますか? その場合、それを機能させるにはどうすればよいですか?

簡単な説明を編集します。オブジェクト B をテストしたいのですが、このオブジェクト B は、それ自体 (this) をパラメーターとして渡すオブジェクト C のインスタンスを作成します。オブジェクト B をスパイする必要があるため、テストで B のインスタンスを作成し、 を呼び出しますMockitoAnnotations.initMocks(this);。この呼び出しの後、両方のオブジェクト (テスト内のオブジェクトと C のインスタンス内のオブジェクト) は同じオブジェクトですか、それとも mockito によって新しいオブジェクトに置き換えられますか?

4

1 に答える 1