1. ホーム
  2. java

Spring-bootアプリケーションのメインクラスをテストする方法

2023-08-22 18:54:39

質問

私は spring-boot アプリケーションで @SpringBootApplication スタータークラスは標準的なもののように見えます。そこで、私はすべての機能に対して多くのテストを作成し、その要約を ソナクベ に送信して、カバレッジを確認しました。

私のスタータークラスでは、Sonarqubeは私のカバレッジが60%しかないことを教えてくれました。つまり、平均的なカバレッジは期待したほど良くはありません。

私のTestクラスは、デフォルトのものだけです。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ElectronicGiftcardServiceApplication.class)
public class ElectronicGiftcardServiceApplicationTests {

    @Test
    public void contextLoads() {
    }
}

では、アプリケーションのスタータークラスでメインクラスをテストするにはどうすればよいでしょうか。

どのように解決するのですか?

どれもやりすぎのような気がするのですが。

メトリックツールを満足させるためにテストを追加することはないでしょう。

アプリケーションのSpringコンテキストを読み込む 時間がかかる . アプリケーションのカバレッジの0.1%を獲得するためだけに、開発者用ビルドのたびに追加するのはやめましょう。

ここで 1つの文だけをカバーするのではありません。 を1つのパブリックメソッドから取得します。というアプリケーションでは、カバレッジの点では何の意味もありません。 何千ものステートメントが一般に書かれるアプリケーションでは .

最初の回避策:内部でBeanが宣言されていないSpring Bootアプリケーションクラスを作成します。もし、Beanがある場合は、それらを設定クラスに移動します(ユニットテストでカバーできるようにするため)。そして、Spring Bootのアプリケーションクラスを無視して テストカバレッジ設定

2つ目の回避策 : もし本当に main() の呼び出しをカバーする必要がある場合 (たとえば組織的な理由)、そのためのテストを作成しますが、統合テスト (継続的インテグレーションツールによって実行され、各開発者ビルドでは実行されない) とし、テストクラスの目的を明確に文書化します。

import org.junit.Test;

// Test class added ONLY to cover main() invocation not covered by application tests.
public class MyApplicationIT {
   @Test
   public void main() {
      MyApplication.main(new String[] {});
   }
}