2010-11-24 10 views
1

インタフェースの1つを実装している抽象クラスの1つをテストする必要があります。 抽象クラスに引数を持つコンストラクタがあります。 私はMockitoをテストフレームワークとして使用しています。 抽象クラスのメソッドを呼び出す必要がある場合は、どのような方法が最適ですか?引数を持つコンストラクタを持つ抽象クラスをテストします。

抽象クラスをサブクラス化しようとすると、引数コンストラクタを実装し、引数なしコンストラクタを記述しないように要求します。 また、引数なしのコンストラクタを持たないクラスを模擬してメソッドにsysoutsを入れようとすると、junitの失敗はありませんが、呼び出されることはありません(mockedクラスに必須の引数なしコンストラクタが必要ですか?

助けてください。前もって感謝します。

+0

は、抽象クラスの引数コンストラクタは保護されていますか?また、私はパラメータ化されたスーパークラスをサブクラスから呼び出すと仮定しています。そうしないと、コンパイル時にエラーが発生します。コードを投稿できますか? @Ralphが示す最良の方法は、具体的なサブクラスを実装することです。通常は、複数の抽象クラスを階層化している場合は、実装する最終的な子孫です。抽象クラスのどれもが親からのメソッドをオーバーライドしていないという前提によって行くと、これは誤りの証明ではありません。その場合は、親メソッドとオーバーライドメソッドの両方をテストする必要があります。 – pmu

答えて

2

抽象クラスをテストする1つの方法は、テストのためにのみ抽象クラスの具象サブクラスを実装することです。

抽象クラスは引数を持つ唯一のコンストラクタを持っている場合は、あなたが行うことができ別物:その引数に

  • パスヌル
  • パス嘲笑オブジェクトの引数にその引数へ
  • パス具体的なオブジェクト

どのように選択するかは、テストケースと抽象クラスの実装によって異なります。もちろん、あなたは方法を混ぜることができます。

例:ところで

abstract class A{ 
    A(Object o) { 
    } 
} 

class TheNullWay extends A { 
    TheNullWay() { 
    super(null); 
    } 
} 

class TheMockedWay extends A { 
    TheMockedWay(Object o){ 
    super(o); 
    } 
} 

new TheMockedWay(createMockedObject()); 

:それは抽象クラスを使用するクラスをテストするための完全な別物です。

関連する問題