2011-08-05 14 views
0

テストクラスが特定のインターフェイスをカバーするように強制する方法を教えてください。jUnitテストを実施してインターフェイス全体をカバーする

また、オーバーロードされたテストメソッドを記述するための規則がありますので、名前は一貫しています(現在の手法はmethodName + parameter1Type + parameter2Type + ...)。

私は最初のことをする良い方法があれば、2番目の質問がカバー/回避されることを望んでいます。


私の問題は、いくつかのインターフェイスを実装するクラスがあることです。私は春に注入されたサービスクラスをテストしているので、すべてに少なくとも1つのインターフェースがあります。

public interface MyInterface{ 
    int doFoo(int input); 
    int doBar(int input); 
} 

がMyInterfaceImplを言うことができます、このインタフェースを実装しています

はとにかく私が実装したクラスを持っていると言います。

今私のテストクラスのようなものになります。上記の今

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
public class MyInterfaceImplTest{ 
    private MyInterface = new MyInterfaceImpl(); //could inject it... 

    @Test 
    public void doFooTest(){ 
     //content of test not relevant 
    } 

    @Test 
    public void doBarTest(){ 
     //content of test not relevant 
    } 
} 

は、サイズの点では悪いことではないが、それは私がより大きなクラスですべてのテストを紹介してきたかどうかを知るのは難しいです、私は1つを逃した可能性があります。また、私はそれがオーバーロードされたメソッドのメソッド名を作成するanyoying見つける。私はクラスに機能を追加して、それを逃した可能性もあります。私がTDDをやっているなら、これはほとんど不可能だろうが、私はまだ確信したいと思う。私が書こうと思ったのは...

そして、それぞれの方法の前に@Testを貼りたいと思います。もちろん、テストに値を入れる必要があるので、これはうまくいかないでしょう。しかし、を実装すると、が実装され、メソッドが追加され、完全なインターフェースが実装されます。明確にするために、私は実際にテストでインターフェイスを実装するのではないと知っていますが、私はこのようなことができれば開発をスピードアップできると思います。

答えて

3

これは、「実施する」と「特定のインターフェースをカバーする」という意味に依存します。

インタフェースメソッドが特定の "契約"を意味する場合(例えば、java.util.Collection.add()が呼び出しの結果受信コレクションが変更された場合はtrueを返します)、インターフェイス、あなたはContract Testを作成することができます。

あなたは、テスト対象のすべてのメソッドは、特定のテストクラスによって行使されていることを確認したい場合は、EMMAまたはCoberturaのようなコードカバレッジツールの下でテストを実行し、結果をお好みに合わせていることを確認することができます。

+0

それよりも、私はJUnitの範囲内にないので、私が探しているものを、考えていたことを後でですか? – Quaternion

0

おそらく、パラメータ化されたテストを調べるべきです。ここでは、TestNGでどのように見えるかです:

@Test(dataProvider = "dp") 
public testInterface(StrategyInterface si) { 
    // will be invoked twice, one with each implementation 
} 

@DataProvider 
static public Object[][] dp() { 
    return new Object[][] { 
    new Object[] { new Strategy1Impl() }, 
    new Object[] { new Strategy2Impl() }, 
    }; 
} 
関連する問題