programing

스프링 부트 및 스팍과의 통합 테스트

goodcopy 2023. 3. 29. 22:14
반응형

스프링 부트 및 스팍과의 통합 테스트

Spark와의 연동 테스트(예: )를 실행하는 가장 좋은 방법은 무엇입니까?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
   }
}

그러나 Spark에서는 응용 프로그램이 시작되지 않습니다.

@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
   }
}

물론 스팍의 경우 그래들 빌드 파일에 적절한 종속성을 지정했습니다.

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

내가 뭘 빼놓았나요?

문제는 스팍 스프링이 스프링을 찾고 있다는 겁니다@ContextConfiguration주석을 찾을 수 없습니다.엄밀히 말하면MyTestSpec 주석이 붙어 있다@ContextConfiguration에 대한 메타 정보이기 때문에@SpringApplicationConfiguration하지만 스팍 스프링은 메타 주석을 탐구의 일부로 여기지 않는다.이 제한을 해결할 문제가 있습니다.그 동안 당신은 그것에 대해 일할 수 있습니다.

그 모든 것@SpringApplicationConfiguration하고 있는 것은 커스터마이즈입니다.@ContextConfigurationBoot 고유의 컨텍스트로더를 사용합니다.즉, 적절하게 구성된 를 사용하여 동일한 효과를 얻을 수 있습니다.@ContextConfiguration주석 대신:

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

업데이트: 확실히 하기 위해(그리고 코멘트에 근거해, 그렇지 않다), 이 조작을 실시하려면 , 다음의 조작을 실시할 필요가 있습니다.org.spockframework:spock-spring수업 중에.

Spring Boot 1.4+ 및 Spok 1.1+를 사용하는 것이 이상적입니다.

Spring Boot에는 유용한 주석이 많이 추가되었습니다.게다가@SpringBootTest그 @ignacio.suay가 언급했다, 그들은 또한 덧붙였다.@TestConfiguration이 기능은 통합 테스트에서 Mockito 대신 스프링 모크를 사용하는 경우에 유용합니다.

조합하면@TestConfiguration새로운 스팍으로DetachedMockFactorySpring 콘텍스트에 Spark Mocks를 삽입하는 데 필요한 모든 컴포넌트가 준비되어 있습니다.

여기 샘플 코드가 있는 블로그 포스트가 있습니다.Spring Integration Testing with Spark 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)
    }
  }
}

업데이트 통합 테스트를 위해 스프링 콘텍스트에 스팍 목재를 주입하기 위해 스팍에서 더 많은 네이티브 지원을 받기 위한 홍보가 있습니다.새로운@SpringBean그리고.@SpringSpy그런 것 같아@MockBean그리고.@SpyBean주석

UPDATE Spok 1.2에는 이러한 변경 사항이 포함되어 있습니다.매뉴얼이 갱신될 때까지 Spring Integration Testing용 Spok 1.2 주석의 미리보기를 실시합니다.

새로운 Spring 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/

다음은 boot application을 시작하고 spark 테스트를 실행하는 설정입니다.

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'
}
}

또한 및 inside에 .build.gradle

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

언급URL : https://stackoverflow.com/questions/24405727/integration-test-with-spring-boot-and-spock

반응형