私はいくつかのコントラクトJUnit 4テストをセットアップしています(この質問への回答のアドバイスに従います)-たとえば、インターフェースがある場合(プロジェクトで使用しているため、例にジェネリックを含めました)-しかし、これは大幅に単純化された例です。
public interface MyInterface<T> {
public T myMethod();
}
抽象的なコントラクト テストを作成できます。例:
public abstract class AbstractMyInterfaceTest<T> {
private final MyInterface<T> _impl;
// plus, store stuff to test against;
public AbstractMyInterfaceTest(MyInterface<T> impl, ... stuff to test against){
_impl = impl;
// stuff to test against...
}
@Test
public void testMyMethod(){
// test some stuff...
}
}
...そして、実装ごとにこの抽象テストクラスを拡張します(これを使用して実行しています@RunWith(Parameterized.class)
)。また、いくつかの変数を渡して、インターフェースの実装を抽象テスト クラスにテストします。
ただし、実際には、一部のインターフェイスは他のインターフェイスの実装であるオブジェクトを返します。そのインターフェイスの抽象コントラクト クラスを使用して (...そして関連する変数に対して) この実装をテストできるようにしたいと考えています。たとえば、 のメソッドMyInterface
は、インターフェースである Iterator を返す場合があります。AbstractIteratorTest
値のセットに対して Iterator のコントラクト テストを実行する別の がありIterator
、 の実装によって返されたが、予想される値のセットでMyInterface
コントラクト テストに合格することを確認したいと考えています。AbstractIteratorTest
現時点では、抽象テスト クラスに以下を追加しています。
// N.b. not setting @Test - so doesn't run all tests twice...
public void runTests(){
testMyMethod();
// etc.
}
ただし、これは各テストを個別に実行しない (たとえばsetUp()
、各テスト メソッドの前に実行する) ため、これらのコントラクト テストで実装が各テストの特定の状態にあると想定される場合は問題があります。(特定の例はIterator
、各テストメソッドがテスト済みの状態を変更できるインターフェイスの実装をテストすることですIterator
)
おそらくJUnit 4の機能を利用して、これを行うためのより良い方法はありますか?
注釈に関するものを見てきまし@RunWith(Suite.class)
たが、それは単一のテスト クラスから複数のテスト クラスを実行することに関するものであり、実行中のさまざまなテスト クラスに変数を渡すことはできません。Suite
私の問題を解決するためにこれを使用する方法があるかもしれませんが、 それが何であるかはわかりません...