Spock 框架如何测试 spring 引导应用程序上下文

Spock Framework how to test spring boot application context

我使用带有 Groovy 脚本的 Spock 框架来测试我的 Java 应用程序。对于我创建的所有 classes,我的项目中的测试覆盖率为 100%。但是,我注意到覆盖范围显示名为 "App" 的主要 class 未经过全面测试。

这是我的应用 class 来启动 Spring 应用程序:

 package com.test.cli;

 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ConfigurableApplicationContext;

 @SpringBootApplication
 public class App {
  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(App.class, args);

    App app = context.getBean(App.class);
    app.start();
  }

  private void start() {
    System.out.print("App started ...");
  }

 }

这是我对 App class:

的单一测试
 package com.test.cli

 import com.test.cli.App
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.test.context.SpringBootTest
 import org.springframework.context.ApplicationContext
 import spock.lang.Specification


 @SpringBootTest(classes = App.class)
 class AppSpecIT extends Specification {

  @Autowired
  ApplicationContext context

  def "it should boot Spring application successfully"() {
    expect: "application context exists"
    context != null
  }

 }

你可以在这个截图中看到,第 12 到 18 行没有被覆盖,我想修复它:

如何使用 Spock 框架全面测试 Spring 引导应用程序上下文?

@SpringBootTest 仅实例化使用 @SpringBootApplication 注释的 class 或通过 classes 显式配置的任何其他配置 class。然而,静态 main 方法不会被执行,并且应该只包含胶水代码 SpringApplication.run(App.class, args) 无论如何。如果您想测试它,则必须明确调用它,但我建议您不要这样做,您可以在此处阅读原因 The tragedy of 100% code coverage.

如果您需要在开始后调用诸如 start 方法之类的东西,请改用 org.springframework.boot.ApplicationRunnerorg.springframework.boot.CommandLineRunner