@IntegrationTest用Spock 进行集成测试(例如)的最佳方法是什么?我想引导整个Spring Boot应用程序并执行一些HTTP调用以测试整个功能。
@IntegrationTest
我可以使用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' } ...
我想念什么吗?
问题在于Spock Spring正在寻找Spring的@ContextConfiguration注解,而没有找到它。严格地说MyTestSpec 被 标注了@ContextConfiguration,因为它是一个元注释@SpringApplicationConfiguration,但斯波克Spring不考虑元注释作为其搜索的一部分。存在一个解决此限制的问题。同时,您可以解决它。
@ContextConfiguration
MyTestSpec
@SpringApplicationConfiguration
所有@SpringApplicationConfiguration要做的就是@ContextConfiguration使用特定于Boot的上下文加载器进行自定义。这意味着您可以通过使用适当配置的@ContextConfiguration注释来达到相同的效果:
@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyServer.class) @WebAppConfiguration @IntegrationTest class MyTestSpec extends Specification { … }
更新: 只是要确保它是明确的(并且基于注释,不是),为此,您需要org.spockframework:spock-spring在类路径中使用。
org.spockframework:spock-spring