Spock Framework如何测试spring boot应用程序上下文

时间:2017-08-12 13:25:53

标签: java spring-boot junit spock applicationcontext

我使用Spock Framework和Groovy脚本来测试我的Java应用程序。对于我创建的所有类,我的项目都有100%的测试覆盖率。但是,我注意到覆盖范围显示主要类叫做#34; App"尚未经过全面测试。

这是我的App类来启动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类的单一测试:

 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行没有涵盖,我想解决这个问题:App Test coverage result

如何使用Spock Framework完全测试Spring Boot应用程序上下文?

1 个答案:

答案 0 :(得分:2)

@SpringBootTest仅实例化使用@SpringBootApplication注释的类或通过classes显式配置的任何其他配置类。但是,静态main方法不会被执行,并且应该只包含粘合代码SpringApplication.run(App.class, args)。如果您想要测试它,那么您必须明确地调用它,但我建议您反对它,您可以在此处阅读为什么The tragedy of 100% code coverage

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