Java 强制Spring引导不使用EmbeddedWebApplicationContext?

Java 强制Spring引导不使用EmbeddedWebApplicationContext?,java,spring,groovy,spring-boot,spock,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) {

我有一个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引导应用程序。大概是这样的:

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。但无论我做什么,SpringBoot都坚持要启动Tomcat服务器,而且它似乎确实在源代码树中引入了标记为@Component和/或@Configuration的其他资源。类路径上还有其他几个应用程序上下文,当然还有暗示web服务类内容的jar文件,但我非常惊讶的是,类路径上的内容应该优先于通过webEnvironment属性进行的显式配置。我使用Gradle 1.12作为构建系统,Spring引导版本是1.1.4,我使用Groovy 2.3.6和Spock 0.7-Groovy-2.0。在此方面的任何帮助都将不胜感激


我在做一些完全不正常的事情吗?谢谢

您可能不应该像现在这样尝试自己引导Spring启动应用程序上下文

下面的代码在不启动嵌入式servlet容器的情况下创建了集成测试环境(尽管如果您想启动嵌入式servlet容器,只需多做几个注释就很容易了):

测试类路径上还必须存在
'org.spockframework:spock-spring:0.7-groovy-2.0'
依赖项


查看Spring Boot官方文档的一部分,如果您没有编写测试,因此无法使用@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中验证

谢谢!成功了。我在测试中使用了@autowiredapplicationcontext-appContext,这似乎有效。有没有更“斯波基”或“春季启动”的方式来获取应用程序上下文?似乎合乎逻辑的是,在加载规范后,它将通过规范本身的属性可用。很高兴它工作了!恐怕我还没有发现一种更为斯波克惯用的接线方式。我仍然很好奇为什么我最初的测试没有成功。在Spring引导文档中记录了这样加载Spring应用程序。我只是想知道它是否与Spock特别不兼容。我没有尝试像您尝试的那样引导应用程序上下文,因此我没有任何关于Anthavio的指针,这正是我在原始问题中显示的测试中所做的,尽管测试是用Groovy编写的,而不是Java:-)
SpringApplication application = new SpringApplication(MyDomainSpringConfig.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);