스프링 부트 및 스팍과의 통합 테스트
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
하고 있는 것은 커스터마이즈입니다.@ContextConfiguration
Boot 고유의 컨텍스트로더를 사용합니다.즉, 적절하게 구성된 를 사용하여 동일한 효과를 얻을 수 있습니다.@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
새로운 스팍으로DetachedMockFactory
Spring 콘텍스트에 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
'programing' 카테고리의 다른 글
Typescript/OnKeyPress에 대한 올바른 매개 변수 유형은 무엇입니까? (0) | 2023.03.29 |
---|---|
PUT 메서드를 Angular의 $http와 함께 사용할 때 쿼리 문자열에 매개 변수 추가 (0) | 2023.03.29 |
GMail Chat은 어떻게 클라이언트의 조작 없이 AJAX 요구를 할 수 있습니까? (0) | 2023.03.29 |
사전에서 문자열 키를 int로 변환 (0) | 2023.03.29 |
Ionic - 로그인 페이지에서만 sidemenu를 제거하는 방법 (0) | 2023.03.29 |