0

私は次のようなスニペットを持っています

public void setTarget(String target) throws TargetException{
   if(target = null){
      throw new TargetException();
   }
   this.target = target;
}

public void getTarget(){
   return this.target;
}

上記のスニペットをユニットテストしています

@Test(expected = TargetException.class)
public void testTargetSetting() throws TargetException{
   //For coverage of code in if loop
   String target = null;
   MyBean.setTarget(target);
   //For coverage of code in else loop
   target="abc";
   MyBean.setTarget(target);
}

上記のコードの問題は、テストするクラスのコードカバレッジが、メソッドsetTargetである100%を示していることです。ifブロックとelseブロックの両方に入ります。ただし、テストクラスメソッド、つまりtestTargetSettingの範囲はカバーされていません。常に赤で表示されます。

コードカバレッジにEmmaを使用しています。実際のクラスメソッドとテストクラスメソッドの両方のコードカバレッジをどのように満たすことができるかについてのアイデア。

注:上記のコードは説明のみを目的としています。

4

2 に答える 2

2

テストクラスをカバーするには、テストクラスのテストクラスを作成する必要があります。そのクラスをカバーするには、テストクラスのテストクラスのテストクラスを作成する必要があります。

簡単に言えば、Emmaのようなツールは、テストクラスのカバレッジを表示するためのものではありません。彼らはあなたのテストクラスを使用して、あなたの通常のクラスのカバレッジを示します。

于 2012-03-12T14:52:33.580 に答える
1

他のテストの前に例外をスローするテストを実行するため、test-Methodは完全にはテストされません。テストフレームワークは例外を予期しているため、テストは失敗しません。ただし、行

target="abc";
MyBean.setTarget(target);

実行されません。

3つの追加の考え:

  • 1つのテストメソッドには2つのテストケースがあります。例外をテストするテストメソッドと、ハッピーパスをテストするテストメソッドが必要です。
  • spookyjonの回答で述べたように、コードカバレッジツールは通常、テストメソッドのカバレッジをチェックするために使用されません。
  • 例外の後のコードが実行される場合、カバレッジを達成します。ただし、アサーションがないため、予期しない例外が発生しなかったという事実を除いて、実際には何もテストしません。アサーションのないテストは特に意味がありません。
于 2012-03-12T15:06:33.527 に答える