10

プロジェクトには、次のようなユーティリティ クラスがあります。

public final class Util {
    private Util() {}
    public static String method1(InputStream in) {...}
    public static String method2(BufferedReader in) {...}
    public static String method3(File file) {...}
}

このクラスは、メソッドのみstaticを含むという意味でユーティリティ クラスです。したがって、それは宣言されfinal、そのコンストラクターはprivateです。インスタンスを作成したり、サブクラスを派生させたりしても、まったく意味がありません。

プロジェクトをテストする一連の単体テストがあります。IntelliJ IDEAを使用してテストを実行し、コード カバレッジを測定して視覚化しています。Utility のコンストラクターは、class Utilカバレッジを下げるようになりました。100% の論理カバレッジで 100% を見たいと思います。Utility クラスのプライベート コンストラクターのようなコードは、カバレッジを低下させます。

そのようなコードをカバレッジ レポートから除外して 100% のカバレッジを表示するために、できれば注釈を使用して、メソッドまたはコンストラクターをコード カバレッジに関連しないものとしてマークする可能性はありますか?

一般に、カバレッジ レポートからコードを非表示にすることは、あなた自身の不利益になることを知っています。レポートに「無視されたアイテム」のリストが含まれていてもかまいません。実際には、誰かが無視してはならないものを無視しているかどうかを確認するのに適しています。要点は、Utility クラスのプライベート コンストラクターのように、カバレッジが意味をなさないコードについてです。

annotations.jar候補が含まれているかどうかを調べてみました。遠くからでもそれができるかのように見える唯一の注釈は でしたがTestOnly、それはこの目的を果たしません。私も覗いてみたplugins/coverage/lib/*.jarのですが、候補が見つからなかったのですが、もしかしたら見落としていたのでしょうか?

更新 この質問は現在廃止されています。一方、IntelliJ IDEA と Jacoco は、呼び出し元を持たないプライベート コンストラクターのカバレッジを無視する方法を学びました。カバレッジ レポートから除外するための会話を引き起こす Java の意図的に到達不能なコードの例を他に知りません。

更新 2 この質問は、Java レコード クラスのアクセサーに関連するものになる可能性があります。

4

2 に答える 2

10

enumはユーティリティ クラスに使用しますが、ほとんどのカバレッジ ツールはそのメソッドを無視することを知っています。

public enum Util { ;

enumfinalデフォルトではコンストラクprivateターがあります。

于 2015-01-02T21:56:52.140 に答える
4

この質問は現在 1 年以上前のものです。ただし、単体テストでプライベート コンストラクターを無視する代わりの方法を提供できると考えました。ほとんどありませんが、Java のプライベート コンストラクターを回避することは可能です。また、クラスが将来変更される可能性、誰かがコンストラクターなどを追加する可能性があります...これを検証する単体テストを持つことは冗長に感じるかもしれませんが、それは別のレベルの意図の明確さを追加します. 単体テストの失敗は確かに私の目を引くでしょう。

これ以上苦労することなく、ここにいくつかのサンプルコードがあります。

ここには、プライベート コンストラクターを持つクラスがあります。

public final class ClassWithPrivateCtor
{
  private ClassWithPrivateCtor()
  {
    throw new AssertionError(String.format(
      "Illegal instantiation of class: %s.",
      this.getClass().getName()));
  }
}

これは、Java でプライベート コンストラクターを呼び出す 1 つの方法です。

private static <T> void invokePrivateConstructor(final Class<T> type)
  throws Throwable
{
  final Constructor<T> constructor = type.getDeclaredConstructor();

  constructor.setAccessible(true);

  try
  {
    constructor.newInstance();
  }
  catch (InvocationTargetException ex)
  {
    throw ex.getTargetException();
  }
}

そして、これが私の単体テストでの使用方法です。

@Test(
  description = "Verify ClassWithPrivateCtor private constructor fails.",
  expectedExceptions = AssertionError.class)
public void classWithPrivateCtorTest()
  throws Throwable
{
  invokePrivateConstructor(ClassWithPrivateCtor.class);
}

私はこの方法でプライベート コンストラクターを検証することを習慣にしています。これは、ユーティリティ クラスであるか、定数を含むクラスであるかなど、クラスの本来の意図を明確にするためです。

于 2016-04-25T16:35:29.037 に答える