アプリケーションのいくつかのテスト ホールを閉じようとしていますが、JaCoCo ソナー プラグインがパッケージ名をテストする必要があると考えているため、enum のカバレッジが小さいことがわかりました。
何故ですか?
列挙型の 1 つで 97% のカバレッジが示され、このようにパッケージ宣言の上に赤い線が表示され、テストするように指示されます...すべての列挙型と列挙型のみでそれを行います。
私はこれに対する答えを探してここに来ました。さらに掘り下げた後、Jacocoがカバーすることを期待しているコンパイル済み列挙型クラスのバイトコードにあるいくつかの静的メソッドが原因であることがわかりました。いくつかの実験の後、JUnit 4 を使用して、列挙型に焦点を当てた単体テストに使用する次のスーパークラスを思い付きました。これにより、列挙型に関するカバレッジの問題が解決されました。
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import static org.junit.Assert.assertEquals;
public abstract class EnumTest {
@Test
public void verifyEnumStatics() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class e = getEnumUnderTest();
Method valuesMethod = e.getMethod("values");
Object[] values = (Object[]) valuesMethod.invoke(null);
Method valueOfMethod = e.getMethod("valueOf", String.class);
assertEquals(values[0], valueOfMethod.invoke(null, ((Enum)values[0]).name()));
}
protected abstract Class getEnumUnderTest();
}
そして、次のように使用します。
public class TravelTypeTest extends EnumTest {
@Override
protected Class getEnumUnderTest() {
return TravelType.class;
}
// other test methods if needed
}
これは大まかな最初の試みです - なんらかの理由でエントリを持たない列挙型では機能しません。同じ効果を得るためのより良い方法があることは間違いありませんが、これにより、生成された静的メソッドが確実に実行されます。列挙型の値を取得し、最初の列挙型エントリの名前を valueOf() メソッドに渡すと、最初の列挙型エントリが返されます。
理想的には、テスト対象のパッケージ内のすべての列挙型を検索し、同じ方法でそれらを自動的に実行するテストを作成します (また、EnumTest から継承する新しい列挙型ごとに新しいテスト クラスを作成することを覚えておく必要はありません)。多くの列挙型がないので、これを試みるプレッシャーはまだ感じていません。