强制Spring Boot不使用EmbeddedWebApplicationContext?

时间:2014-08-11 23:18:15

标签: java spring groovy spring-boot spock

我有一个Spock测试用例,我想加载一个Spring应用程序。我有一个非常基本的Groovy类,它是我的配置对象:

@Configuration
@EnableAutoConfiguration
class TestConfig {
  @Bean
  Map createSillyMsgMap() {
    ["sillyMsg" : "This is a silly message"]
  }
  public static void main(String[] args) {
    println "TestConfig.main(${args})"
  }
}

显然,这不是很有用,但它可以作为一个例子。为方便起见,我还在该类中添加了main方法。我的测试类只是尝试将其实例化为Spring Boot Application。像这样:

class AppContextSpec extends Specification {
  def "testSpringApplication"() {
    given: "a Spring Configuration"
    SpringApplication app = new SpringApplication(TestConfig)
    app.headless = true 
    app.webEnvironment = false
    app.applicationContextClass = AnnotationConfigApplicationContext

    expect: "the Spring Application to be able to start"
    ConfigurableApplicationContext ctxt = app.run((String[]) ["blah"])
  }
}

我试图通过将webEnvironment属性显式设置为false来强制Spring Boot不使用EmbeddedWebApplicationContext。但无论我做什么,Spring Boot都坚持启动Tomcat服务器,它似乎确实引入了源代码树中用@Component和/或@Configuration标记的其他资源。类路径上还有其他几个应用程序上下文,当然还有jar文件暗示Web服务类的东西,但我很惊讶类路径上的内容应该优先于通过webEnvironment属性进行显式配置。我使用Gradle 1.12作为构建系统,Spring Boot版本是1.1.4,我使用Groovy 2.3.6和Spock 0.7-groovy-2.0。对此有任何帮助表示赞赏。

我是否完全不符合常规?谢谢。

2 个答案:

答案 0 :(得分:1)

如果您没有编写测试,因此无法使用@ContextConfiguration

而不是简单的SpringApplication.run(MyDomainSpringConfig.class, args);

像这样构建并运行SpringApplication ......

SpringApplication application = new SpringApplication(MyDomainSpringConfig.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);

在Spring Boot 1.2.1中验证

答案 1 :(得分:0)

您可能不应该像自己一样尝试自己引导Spring Boot应用程序上下文。

以下代码创建了一个集成测试环境,但没有启动嵌入式servlet容器(尽管如果要启动嵌入式servlet容器,可以很容易地使用几个注释):

@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestConfig.class)
class ExampleSpec extends Specification {

    // ...

}

您还必须在测试类路径中显示'org.spockframework:spock-spring:0.7-groovy-2.0'依赖关系

查看this部分Spring Boot官方文档和this SO问题