1

私はレガシー コード用の JUnit テストをいくつか作成しており、注釈を使用することの大ファンです。スパイされたオブジェクトへの宣言を作成し、後でインスタンス化できるかどうかを知りたいです。私が尋ねる理由は、null 以外のコンストラクタを持つクラスがあるためです。このコンストラクターの値は、テスト ケースのセットアップ後までわかりません。以下のコードは、私がやりたいことを示しています。

@RunWith(MockitoJUnitRunner.class)
public class ObjectUndertestTest {

    @Spy private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne;
    private Integer parameterTwo;

    @Before
    public void setupTest() {
        parameterOne = 1;
        parameterTwo = 2;
        someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo);
    }
}

これを実行できる唯一の方法は、構文を組み合わせて、従来のスパイ (オブジェクトからモック) 表記を使用することです。あれは:

@RunWith(MockitoJUnitRunner.class)
public class ObjectUndertestTest {

    private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne;
    private Integer parameterTwo;

    @Before
    public void setupTest() {
        parameterOne = 1;
        parameterTwo = 2;
        someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo);
        SomeClassToSpy spySomeClassToSpy spy(someClassToSpy);
    }
}

または似たようなもの。これについて何か考えはありますか?

4

1 に答える 1

1

これは実際にはドキュメントの注釈ではないことに注意してください@Spy。これは、MockitoJUnitRunner (et al) が文書化された使用パターンに従ってスパイを自動的に初期化するための指示です。注釈は便利で有益ですが、意味論ではなく名前に注釈を使用すると、さらに混乱が生じる可能性があると思います。

つまり、選択したコンストラクター引数を使用してインスタンスを構築するだけの問題であれば、コンストラクターを直接かつ明示的に呼び出し、Mockito の初期化を使用してスパイでラップすることができます ( @Spy docsのように)。

@Spy private SomeClassToSpy someClassToSpy = new SomeClassToSpy(1, 2);

クラス初期化子またはコンストラクターよりも @Before メソッドを好むのは正しいことですが、これは明示的に文書化された初期化方法であり、テスト汚染や初期化順序の問題を引き起こす可能性は低いです。

于 2015-12-03T21:07:28.423 に答える