gradle 如何在Spock集成测试中启动Sping Boot 应用程序

p3rjfoxz  于 2023-06-06  发布在  其他
关注(0)|答案(4)|浏览(255)

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

  • Sping Boot 应用程序在此工作的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'
}
...
lp0sw83n

lp0sw83n1#

问题是Spock Spring正在寻找Spring的@ContextConfiguration注解,但没有找到它。严格地说,MyTestSpec * 是用@ContextConfiguration注解的,因为它是@SpringApplicationConfiguration上的元注解,但Spock Spring不认为元注解是其搜索的一部分。有一个issue来解决这个限制。与此同时,你可以围绕它工作。
@SpringApplicationConfiguration所做的一切就是使用特定于Boot的上下文加载器定制@ContextConfiguration。这意味着您可以通过使用适当配置的@ContextConfiguration注解来实现相同的效果:

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

**更新:**只是为了确保它是清晰的(根据评论,它不是),要使其工作,您需要在类路径上有org.spockframework:spock-spring

jrcvhitl

jrcvhitl2#

理想情况下,您将使用Sping Boot 1.4+和Spock 1.1+。
Sping Boot 添加了很多有用的注解。除了@伊格纳西奥.suay提到的@SpringBootTest之外,他们还添加了@TestConfiguration,如果您想在集成测试中使用Spring mock而不是Mockito,这将非常有用。
如果您将@TestConfiguration与新的Spock DetachedMockFactory结合,那么您就拥有了将Spock Mocks注入Spring上下文所需的所有组件。
我在这里有一个带有示例代码的博客文章:Spring Integration Testing with Spock Mocks
快速和肮脏的是这个

@SpringBootTest
class MyIntegrationTest extends Specification {

  @Autowired ExternalRankingService externalRankingServiceMock

  def "GetRank"() {
    when:
    classUnderTest.getRankFor('Bob')

    then:
    1 * externalRankingServiceMock.fetchRank('Bob') >> 5

  }

  @TestConfiguration
  static class Config {
    private DetachedMockFactory factory = new DetachedMockFactory()

    @Bean
    ExternalRankingService externalRankingService() {
      factory.Mock(ExternalRankingService)
    }
  }
}

更新a PR,可以在Spock中获得更多的原生支持,以便将Spock Mocks注入Spring上下文进行集成测试。新的@SpringBean@SpringSpy将类似于@MockBean@SpyBean注解
更新Spock 1.2现在应该包含这些更改。在文档更新之前,这里是一个preview of the Spock 1.2 Annotations for Spring Integration Testing

dm7nw8vv

dm7nw8vv3#

在新的Sping Boot 版本(1.4)中,而不是使用:

@SpringApplicationConfiguration(classes = MyServer.class)
@WebAppConfiguration
@IntegrationTest

你可以用

@SpringBootTest(classes = MyServer.class)

您将能够启动应用程序上下文并设置任何依赖项。
有关详细信息,请查看以下示例:http://ignaciosuay.com/how-to-do-integration-tests-with-spring-boot-and-spock/

jutyujz0

jutyujz04#

下面是一个启动 Boot 应用程序然后运行spock测试的设置:

class HelloControllerSpec extends Specification {

@Shared
@AutoCleanup
ConfigurableApplicationContext context

void setupSpec() {
    Future future = Executors
            .newSingleThreadExecutor().submit(
            new Callable() {
                @Override
                public ConfigurableApplicationContext call() throws Exception {
                    return (ConfigurableApplicationContext) SpringApplication
                            .run(Application.class)
                }
            })
    context = future.get(60, TimeUnit.SECONDS)
}

void "should return pong from /ping"() {
    when:
    ResponseEntity entity = new RestTemplate().getForEntity("http://localhost:8080/ping", String.class)

    then:
    entity.statusCode == HttpStatus.OK
    entity.body == 'pong'
}
}

记住在build.gradle中添加对spock和groovy的依赖项。

dependencies {
    // other dependencies
    testCompile "org.codehaus.groovy:groovy-all:2.2.0"
    testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
}

相关问题