一尘不染

与Spring Boot和Spock的集成测试

spring-boot

@IntegrationTest用Spock
进行集成测试(例如)的最佳方法是什么?我想引导整个Spring Boot应用程序并执行一些HTTP调用以测试整个功能。

我可以使用JUnit做到这一点(首先运行应用程序,然后执行测试):

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyServer.class)
@WebAppConfiguration
@IntegrationTest
class MyTest {
   RestTemplate template = new TestRestTemplate();

   @Test
   public void testDataRoutingWebSocketToHttp() {
      def a = template.getForEntity("http://localhost:8080", String.class)
      println a
   }
}

但是使用Spock时,应用程序无法启动:

@SpringApplicationConfiguration(classes = MyServer.class)
@WebAppConfiguration
@IntegrationTest
class MyTestSpec extends Specification {

   RestTemplate template = new TestRestTemplate();

   def "Do my test"() {
      setup:
      def a = template.getForEntity("http://localhost:8080", String.class)

      expect:
      println a
   }
}

对于Spock,我当然在我的Gradle构建文件中指定了适当的依赖项:

...
dependencies {
   testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
   testCompile 'org.spockframework:spock-spring:0.7-groovy-2.0'
}
...

我想念什么吗?


阅读 730

收藏
2020-05-30

共1个答案

一尘不染

问题在于Spock Spring正在寻找Spring的@ContextConfiguration注解,而没有找到它。严格地说MyTestSpec

标注了@ContextConfiguration,因为它是一个元注释@SpringApplicationConfiguration,但斯波克Spring不考虑元注释作为其搜索的一部分。存在一个解决此限制的问题。同时,您可以解决它。

所有@SpringApplicationConfiguration要做的就是@ContextConfiguration使用特定于Boot的上下文加载器进行自定义。这意味着您可以通过使用适当配置的@ContextConfiguration注释来达到相同的效果:

@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyServer.class)
@WebAppConfiguration
@IntegrationTest
class MyTestSpec extends Specification {
    …
}

更新: 只是要确保它是明确的(并且基于注释,不是),为此,您需要org.spockframework:spock-spring在类路径中使用。

2020-05-30