2020/06/16 - [IT/SpringBoot] - 스프링 부트 #4.15-25. REST서비스 호출 외
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.14. 메시징
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.13. 캐싱
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.12. NoSQL
2020/06/15 - [IT/SpringBoot] - 스프링 부트 #4.11. SQL 데이터베이스 작업
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.10. 보안
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.8-9 Graceful/RSocket
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.7 웹 애플리케이션 개발
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.5-6 국제화/JSON
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.3-4 프로필/로깅
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.2 외부화된 구성
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #4.1 스프링 애플리케이션
2020/06/14 - [IT/SpringBoot] - 스프링 부트 #3. 사용
4.26. 테스트
Spring Boot는 응용 프로그램을 테스트할 때 도움이 되는 여러 유틸리티와 주석을 제공합니다. 테스트 지원은 핵심 항목을 포함하고 테스트를 위한 자동 구성을 지원하는 두 모듈에서 제공됩니다.spring-boot-test
spring-boot-test-autoconfigure
대부분의 개발자는 스프링 부트 테스트 모듈뿐만 아니라 JUnit 목성, AssertJ, Hamcrest 및 기타 유용한 라이브러리를 모두 가져오는 "스타터"를 사용합니다.spring-boot-starter-test
스타터는 또한 당신이 JUnit 4와 JUnit 5 테스트를 모두 실행할 수 있도록 빈티지 엔진을 제공합니다. 테스트를 JUnit 5로 마이그레이션한 경우 다음 예제와 같이 JUnit 4 지원을 제외해야 합니다.
|
4.26.1. 테스트 범위 종속성
"스타터"(에서)에는 다음과 같은 라이브러리가 포함되어 있습니다.spring-boot-starter-test
test
scope
일반적으로 이러한 공통 라이브러리는 테스트를 작성할 때 유용할 수 있습니다. 이러한 라이브러리가 필요에 맞지 않는 경우 고유한 테스트 종속성을 추가할 수 있습니다.
4.26.2. 스프링 애플리케이션 테스트
종속성 주입의 주요 장점 중 하나는 코드를 단위 테스트가 더 쉽게 만들어야 한다는 것입니다. 스프링을 포함하지 않고 연산자사용으로 객체를 인스턴스화할 수 있습니다. 실제 종속성 대신 모의 개체를 사용할 수도 있습니다.new
종종 장치 테스트를 넘어 스프링과 함께 통합 테스트를 시작해야 하는 경우가 많습니다. 응용 프로그램을 배포하거나 다른 인프라에 연결할 필요 없이 통합 테스트를 수행할 수 있습니다.ApplicationContext
Spring Framework에는 이러한 통합 테스트를 위한 전용 테스트 모듈이 포함되어 있습니다. 종속성을 직접 선언하거나 "스타터"를 사용하여 전이적으로 가져올 수 있습니다.org.springframework:spring-test
spring-boot-starter-test
이전에 모듈을 사용하지 않은 경우 Spring Framework 참조 설명서의 관련 섹션을 읽는 것으로 시작해야 합니다.spring-test
4.26.3. 스프링 부트 응용 프로그램 테스트
스프링 부트 응용 프로그램은 스프링, 그래서 아무것도 매우 특별한 당신이 일반적으로 바닐라 스프링 컨텍스트로 무엇을 할 것 이상으로 테스트하기 위해 수행 할 수 없습니다.ApplicationContext
스프링 부트의 외부 속성, 로깅 및 기타 기능은 기본적으로 컨텍스트에 설치됩니다. SpringApplication |
스프링 부트은 스프링 부트 기능이 필요할 때 표준 어노션의 대안으로 사용할 수 있는 어노피를 제공합니다. 이 애니쳐지는 SpringApplication을
통해 테스트에 사용된 응용 프로그램 컨텍스트를
만들어 작동합니다. 응용 프로그램의 보다 구체적인 조각을 테스트하기 위해 여러 가지 다른 주석도 제공됩니다.@SpringBootTest
spring-test
@ContextConfiguration
@SpringBootTest
JUnit 4를 사용하는 경우 테스트에 추가하는 것을 잊지 마세요. JUnit 5를 사용하는 경우 해당 주석을 추가할 필요가 없으며 다른 주석은 이미 주석이 추가됩니다. @RunWith(SpringRunner.class) @ExtendWith(SpringExtension.class) @SpringBootTest @…Test |
기본적으로 서버가 시작되지 않습니다. 테스트 실행 방식을 더 구체화하기 위해 속성을 사용할 수 있습니다.@SpringBootTest
webEnvironment
@SpringBootTest
MOCK
(기본값) : 웹을 로드하고 모의 웹 환경을 제공합니다. 이 어노월션을 사용할 때임베디드 서버가 시작되지 않습니다. 클래스경로에서 웹 환경을 사용할 수 없는 경우 이 모드는 투명하게 다시 일반 비웹을 만드는 것으로 돌아갑니다. 웹 응용 프로그램의 모의 기반 테스트를 위해@AutoConfigureMockMvc
또는@AutoConfigureWebTestClient
함께 사용할 수 있습니다.ApplicationContext
ApplicationContext
RANDOM_PORT
: 로드하고 실제 웹 환경을 제공합니다. 임베디드 서버가 시작되고 임의포트에서 수신 대기합니다.WebServerApplicationContext
DEFINED_PORT
: 로드하고 실제 웹 환경을 제공합니다. 임베디드 서버가 정의된 포트(사용자에서) 또는 기본 포트에서 시작되고 수신대기됩니다.WebServerApplicationContext
application.properties
8080
NONE
: 사용 하 여 로드 하지만 웹 환경 (모의 또는 다른)를 제공 하지 않습니다.ApplicationContext
SpringApplication
테스트가 있는 경우 기본적으로 각 테스트 메서드의 끝에 트랜잭션을 롤백합니다. 그러나 이 배열을 실제 서슬레 환경을 사용하거나 암시적으로 제공하는 것처럼 HTTP 클라이언트와 서버는 별도의 스레드에서 실행되므로 별도의 트랜잭션에서 실행됩니다. 이 경우 서버에서 시작된 트랜잭션이 롤백되지 않습니다. @Transactional RANDOM_PORT DEFINED_PORT |
@SpringBootTest 응용 프로그램이 관리 서버에 대해 다른 포트를 사용하는 경우 별도의 임의 포트에서 관리 서버를 시작합니다. webEnvironment = WebEnvironment.RANDOM_PORT |
웹 응용 프로그램 유형 검색
Spring MVC를 사용할 수 있는 경우 일반 MVC 기반 응용 프로그램 컨텍스트가 구성됩니다. 스프링 웹플럭스만 있는 경우 이를 감지하고 대신 WebFlux 기반 응용 프로그램 컨텍스트를 구성합니다.
둘 다 있는 경우 스프링 MVC가 우선합니다. 이 시나리오에서 반응형 웹 응용 프로그램을 테스트하려면 다음 속성을 설정해야 합니다.spring.main.web-application-type
@SpringBootTest(properties = "spring.main.web-application-type=reactive")
class MyWebFluxTests { ... }
테스트 구성 감지
스프링 테스트 프레임워크에 익숙한 경우 로드할 스프링을 지정하기 위해 사용할 수 있습니다. 또는 테스트 내에서 중첩 된 클래스를 자주 사용했을 수도 있습니다.@ContextConfiguration(classes=…)
@Configuration
@Configuration
스프링 부트 응용 프로그램을 테스트할 때 이 응용 프로그램은 필요하지 않은 경우가 많습니다. 스프링 부트의 주석은 명시적으로 정의하지 않을 때마다 기본 구성을 자동으로 검색합니다.@*Test
검색 알고리즘은 테스트가 포함된 패키지에서 작동하여 에 추가된 클래스또는 . 코드를 합리적인 방식으로 구조화하는 한 일반적으로 기본 구성이 발견됩니다.@SpringBootApplication
@SpringBootConfiguration
테스트 애니폰을 사용하여 응용 프로그램의 보다 구체적인 조각을 테스트하는경우 기본 메서드의 응용 프로그램 클래스의특정 영역에 특정 구성 설정을 추가하지 않아야 합니다. 기본 구성 요소 검사 구성은 슬라이스가 예상대로 작동하는지 확인하는 데 사용되는 필터를 제외합니다. -에 추가된 클래스에서 명시적 지시문을 사용하는 경우 해당 필터가 비활성화됩니다. 슬라이스를 사용하는 경우 다시 정의해야 합니다. |
기본 구성을 사용자 지정하려면 중첩된 클래스를 사용할 수 있습니다. 응용 프로그램의 기본 구성 대신 사용되는 중첩 클래스와 달리 중첩 클래스는 응용 프로그램의 기본 구성 외에도 사용됩니다.@TestConfiguration
@Configuration
@TestConfiguration
스프링의 테스트 프레임워크는 테스트 간에 응용 프로그램 컨텍스트를 캐시합니다. 따라서 테스트가 동일한 구성을 공유하는 한(검색 방식에 관계없이) 컨텍스트를 로드하는 데 시간이 많이 소요될 수 있는 프로세스는 한 번만 발생합니다. |
테스트 구성 제외
응용 프로그램에서 구성 요소 검색을 사용하는 경우(예: 사용 중이거나 사용중이면) 특정 테스트에 대해서만 만든 최상위 구성 클래스가 실수로 어디서나 픽업될 수 있습니다.@SpringBootApplication
@ComponentScan
앞에서 보았듯이테스트의 내부 클래스에서 기본 구성을 사용자 지정하는 데 사용할 수 있습니다. 최상위 클래스에 배치할 때 스캔을 통해 클래스를 선택해서는 안 된다는 것을 나타냅니다. 그런 다음 다음 예제와 같이 필요한 경우 해당 클래스를 명시적으로 가져올 수 있습니다.@TestConfiguration
@TestConfiguration
src/test/java
@SpringBootTest
@Import(MyTestsConfiguration.class)
class MyTests {
@Test
void exampleTest() {
...
}
}
직접 사용하는 경우 (즉, 통과하지 않음) 당신은 그것으로 등록해야합니다. 자세한 내용은 Javadoc을 참조하십시오. @ComponentScan @SpringBootApplication TypeExcludeFilter |
응용 프로그램 인수 사용
응용 프로그램에서 인수를 예상하는 경우 특성을사용하여 주입할 수 있습니다.@SpringBootTest
args
@SpringBootTest(args = "--app.test=one")
class ApplicationArgumentsExampleTests {
@Test
void applicationArgumentsPopulated(@Autowired ApplicationArguments args) {
assertThat(args.getOptionNames()).containsOnly("app.test");
assertThat(args.getOptionValues("app.test")).containsOnly("one");
}
}
모의 환경으로 테스트
기본적으로 서버를 시작하지 않습니다. 이 모의 환경에 대해 테스트할 웹 끝점이 있는 경우 다음 예제와 같이 MockMvc를
추가로 구성할 수 있습니다.@SpringBootTest
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
class MockMvcExampleTests {
@Test
void exampleTest(@Autowired MockMvc mvc) throws Exception {
mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World"));
}
}
웹 레이어에만 집중하고 완전을 시작하지 않으려면 대신 @WebMvcTest 사용하는것이 좋습니다. ApplicationContext |
또는 다음 예제와 같이 WebTestClient를
구성할 수 있습니다.
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
@SpringBootTest
@AutoConfigureWebTestClient
class MockWebTestClientExampleTests {
@Test
void exampleTest(@Autowired WebTestClient webClient) {
webClient.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello World");
}
}
조롱된 환경에서 테스트하는 것은 일반적으로 전체 Servlet 컨테이너로 실행하는 것보다 빠릅니다. 그러나 스프링 MVC 계층에서 조롱이 발생하기 때문에 하위 수준 Servlet 컨테이너 동작에 의존하는 코드는 MockMvc로 직접 테스트할 수 없습니다. 예를 들어 스프링 부트의 오류 처리는 Servlet 컨테이너에서 제공하는 "오류 페이지" 지원을 기반으로 합니다. 즉, MVC 계층이 예상대로 예외를 던지고 처리한다고 테스트할 수 있지만 특정 사용자 지정 오류 페이지가 렌더링되는 지 직접 테스트할 수 없습니다. 이러한 하위 수준 문제를 테스트해야 하는 경우 다음 섹션에 설명된 대로 완전히 실행되는 서버를 시작할 수 있습니다. |
실행 중인 서버로 테스트
전체 실행 중인 서버를 시작해야 하는 경우 임의포트를 사용하는 것이 좋습니다. 사용하는 경우 테스트가 실행될 때마다 사용 가능한 포트를 무작위로 선택합니다.@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
이 애니칭을 사용하여 테스트에 사용된 실제 포트를 삽입할 수 있습니다. 편의를 위해 시작된 서버에 REST 호출을 해야 하는 테스트는 실행 중인 서버에 대한 상대적 링크를 해결하고 다음 예제와 같이 응답을 확인하기 위한 전용 API가 포함된 WebTestClient를
추가로 수행할 수 있습니다.@LocalServerPort
@Autowire
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.web.reactive.server.WebTestClient;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class RandomPortWebTestClientExampleTests {
@Test
void exampleTest(@Autowired WebTestClient webClient) {
webClient.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello World");
}
}
이 설정은 클래스 경로에 필요합니다. 웹플럭스를 추가할 수 없거나 추가하지 않는 경우 스프링 부트은 다음과 같은 기능을 제공합니다.spring-webflux
TestRestTemplate
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class RandomPortTestRestTemplateExampleTests {
@Test
void exampleTest(@Autowired TestRestTemplate restTemplate) {
String body = restTemplate.getForObject("/", String.class);
assertThat(body).isEqualTo("Hello World");
}
}
사용자 정의 웹테스트클라이언트
콩을 사용자 정의하려면 콩을 구성합니다. 이러한 콩은 를 만드는 데 사용되는 것으로 호출됩니다.WebTestClient
WebTestClientBuilderCustomizer
WebTestClient.Builder
WebTestClient
JMX 사용
테스트 컨텍스트 프레임워크가 컨텍스트를 캐시하므로 동일한 구성 요소가 동일한 도메인에 등록되지 않도록 기본적으로 JMX가 비활성화됩니다. 이러한 테스트에 대한 액세스가 필요한 경우, 더러워 표시하는 것도 고려해 보십시오.MBeanServer
@ExtendWith(SpringExtension.class)
@SpringBootTest(properties = "spring.jmx.enabled=true")
@DirtiesContext
class SampleJmxTests {
@Autowired
private MBeanServer mBeanServer;
@Test
void exampleTest() {
// ...
}
}
콩을 조롱하고 감시
테스트를 실행할 때 응용 프로그램 컨텍스트 내에서 특정 구성 요소를 모의해야 하는 경우가 있습니다. 예를 들어 개발 중에 사용할 수 없는 일부 원격 서비스에 대한 외관이 있을 수 있습니다. 실제 환경에서 트리거하기 어려울 수 있는 오류를 시뮬레이션하려는 경우에도 Mocking이 유용할 수 있습니다.
스프링 부트에는 내부콩에 대한 Mockito 모의를 정의하는 데 사용할 수 있는 어노피가 포함되어 있습니다. 이 애니테션을 사용하여 새 콩을 추가하거나 단일 기존 콩 정의를 대체할 수 있습니다. 이 성기는 테스트 클래스, 테스트 내의 필드 또는 클래스 및 필드에서 직접 사용할 수 있습니다. 필드에서 사용할 경우 생성된 모의 인스턴스도 주입됩니다. 모의 콩은 각 테스트 방법 후에 자동으로 재설정됩니다.@MockBean
ApplicationContext
@Configuration
테스트가 스프링 부트의 테스트 주석 중 하나를 사용하는 경우(예: 이 기능이 자동으로 활성화됩니다) 다른 배열과 함께 이 기능을 사용하려면 다음 예제와 같이 수신기를 명시적으로 추가해야 합니다.
|
다음 예제는 기존 빈을 모의 구현으로 대체합니다.RemoteService
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.context.*;
import org.springframework.boot.test.mock.mockito.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
@SpringBootTest
class MyTests {
@MockBean
private RemoteService remoteService;
@Autowired
private Reverser reverser;
@Test
void exampleTest() {
// RemoteService has been injected into the reverser bean
given(this.remoteService.someCall()).willReturn("mock");
String reverse = reverser.reverseSomeCall();
assertThat(reverse).isEqualTo("kcom");
}
}
@MockBean 응용 프로그램 컨텍스트 새로 고침 중에 운동하는 콩의 동작을 모의하는 데 사용할 수 없습니다. 테스트가 실행될 때까지 응용 프로그램 컨텍스트 새로 고침이 완료되었으며 조롱된 동작을 구성하기에는 너무 늦었습니다. 이 상황에서 모의를 만들고 구성하는 방법을 사용하는 것이 좋습니다. @Bean |
또한 기존 콩을 Mockito로 래핑하는 데 사용할 수 있습니다. 자세한 내용은 Javadoc을 참조하십시오.@SpyBean
spy
범위가 있는 콩에 대해 생성된 프록시와 같은 CGLib 프록시는 프록시 메서드를 로 선언합니다. 이렇게 하면 Mockito가 기본 구성에서 메서드를 조롱하거나 감시할 수 없으므로 올바르게 작동하지 않습니다. 이러한 콩을 조롱하거나 감시하려는 경우 응용 프로그램의 테스트 종속성에 추가하여 Mockito를 인라인 모의 메이커를 사용하도록 구성합니다. 이를 통해 모키토는 방법을 조롱하고 감시할 수 있습니다. final final org.mockito:mockito-inline final |
Spring의 테스트 프레임워크는 테스트 간에 응용 프로그램 컨텍스트를 캐시하고 동일한 구성을 공유하는 테스트의 컨텍스트를 다시 사용하지만 캐시 키를 사용하거나 영향을 미치므로 컨텍스트 수가 증가할 가능성이 큽니까. @MockBean @SpyBean |
이름으로 매개 변수를 참조 하는 메서드와 콩을 감시 하는 데 사용 하는 경우 응용 프로그램을 컴파일 해야 합니다 . 이렇게 하면 콩이 스파이되면 캐싱 인프라에서 매개 변수 이름을 사용할 수 있습니다. @SpyBean @Cacheable -parameters |
자동 구성 테스트
스프링 부트의 자동 구성 시스템은 응용 프로그램에 적합하지만 때로는 테스트에 너무 많이 할 수 있습니다. 응용 프로그램의 "슬라이스"를 테스트하는 데 필요한 구성 부분만 로드하는 데 도움이 됩니다. 예를 들어 Spring MVC 컨트롤러가 URL을 올바르게 매핑하고 해당 테스트에 데이터베이스 호출을 포함하지 않거나 JPA 엔터티를 테스트하려는 경우 해당 테스트가 실행될 때 웹 레이어에 관심이 없는지 테스트할 수 있습니다.
이 모듈에는 이러한 "슬라이스"를 자동으로 구성하는 데 사용할 수 있는 여러 주석이 포함되어 있습니다. 각각은 비슷한 방식으로 작동하여 자동 구성 설정을 사용자 지정하는 데 사용할 수 있는 주석과 하나 이상의 주석을 로드하는 주석을 제공합니다.spring-boot-test-autoconfigure
@…Test
ApplicationContext
@AutoConfigure…
각 슬라이스는 구성 요소 스캔을 적절한 구성 요소로 제한하고 매우 제한된 자동 구성 클래스 집합을 로드합니다. 그 중 하나를 제외해야 하는 경우 대부분의 주석은 특성을 제공합니다. 또는 사용할 수 있습니다. @…Test excludeAutoConfiguration @ImportAutoConfiguration#exclude |
한 테스트에서 여러 주석을 사용하여 여러 개의 "슬라이스"를 포함하면 지원되지 않습니다. 여러 개의 "슬라이스"가 필요한 경우 주석 중 하나를 선택하고 다른 "슬라이스"의 주석을 손으로 포함합니다. @…Test @…Test @AutoConfigure… |
표준 주석과 주석을 사용할 수도 있습니다. 응용 프로그램을 "슬라이싱"에 관심이 없지만 자동 구성된 테스트 빈 중 일부를 원하는 경우 이 조합을 사용할 수 있습니다. @AutoConfigure… @SpringBootTest |
자동 구성 JSON 테스트
JSON 직렬화 및 직렬화가 예상대로 작동하는지 테스트하려면 음표기를 사용할 수 있습니다. 사용 가능한 지원 되는 JSON 매퍼를 자동으로 구성, 다음 라이브러리 중 하나가 될 수 있는:@JsonTest
@JsonTest
- 잭슨, 어떤 콩과 어떤 잭슨 s
ObjectMapper
@JsonComponent
Module
Gson
Jsonb
활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @JsonTest |
자동 구성의 요소를 구성해야 하는 경우 이 노를 사용할 수 있습니다.@AutoConfigureJsonTesters
스프링 부트에는 JSONAssert 및 JsonPath 라이브러리와 함께 작업하는 AssertJ 기반 도우미가 포함되어 JSON이 예상대로 나타나는지 확인합니다. , 및 클래스는 각각 잭슨, 그손, Jsonb 및 문자열에 사용할 수 있습니다. 테스트 클래스의 모든 도우미 필드는 사용할 때일 수 있습니다. 다음 예제에서는 Jackson에 대한 테스트 클래스가 표시됩니다.JacksonTester
GsonTester
JsonbTester
BasicJsonTester
@Autowired
@JsonTest
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.json.*;
import org.springframework.boot.test.context.*;
import org.springframework.boot.test.json.*;
import static org.assertj.core.api.Assertions.*;
@JsonTest
class MyJsonTests {
@Autowired
private JacksonTester<VehicleDetails> json;
@Test
void testSerialize() throws Exception {
VehicleDetails details = new VehicleDetails("Honda", "Civic");
// Assert against a `.json` file in the same package as the test
assertThat(this.json.write(details)).isEqualToJson("expected.json");
// Or use JSON path based assertions
assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make")
.isEqualTo("Honda");
}
@Test
void testDeserialize() throws Exception {
String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
assertThat(this.json.parse(content))
.isEqualTo(new VehicleDetails("Ford", "Focus"));
assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
}
}
JSON 도우미 클래스는 표준 단위 테스트에서 직접 사용할 수도 있습니다. 이렇게 하려면 사용하지 않는 경우 메서드에서 도우미 메서드를 호출합니다. initFields @Before @JsonTest |
스프링 부트의 AssertJ 기반 도우미를 사용하여 지정된 JSON 경로의 숫자 값을 주장하는 경우 형식에 따라 사용하지 못할 수 있습니다. 대신 AssertJ를 사용하여 값이 지정된 조건과 일치한다고 주장할 수 있습니다. 예를 들어 다음 예제에서는 실제 숫자가 오프셋 내에서 가까운 플로트 값이라고 주장합니다.isEqualTo
satisfies
0.15
0.01
assertThat(json.write(message))
.extractingJsonPathNumberValue("@.test.numberValue")
.satisfies((number) -> assertThat(number.floatValue()).isCloseTo(0.15f, within(0.01f)));
자동 구성 스프링 MVC 테스트
Spring MVC 컨트롤러가 예상대로 작동하는지 테스트하려면 송어를 사용합니다. 스프링 MVC 인프라를 자동으로 구성하고 스캔한 콩을 , , , , , 및 로 제한합니다. 이 주석을 사용할 때 일반 콩은 스캔되지 않습니다.@WebMvcTest
@WebMvcTest
@Controller
@ControllerAdvice
@JsonComponent
Converter
GenericConverter
Filter
HandlerInterceptor
WebMvcConfigurer
HandlerMethodArgumentResolver
@Component
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @WebMvcTest |
Jackson과 같은 추가 구성 요소를 등록해야 하는 경우 테스트에서 사용하여 추가 구성 클래스를 가져올 수 있습니다. Module @Import |
종종 단일 컨트롤러로 제한되며 필요한 공동 작업자에 대한 모의 구현을 제공하기 위해 함께 사용됩니다.@WebMvcTest
@MockBean
@WebMvcTest
또한 자동으로 구성된다. Mock MVC는 전체 HTTP 서버를 시작하지 않고도 MVC 컨트롤러를 신속하게 테스트할 수 있는 강력한 방법을 제공합니다.MockMvc
또한 비-(예:)로 자동 구성할 수 있습니다. 다음 예제에서는 다음을 사용합니다. MockMvc @WebMvcTest @SpringBootTest @AutoConfigureMockMvc MockMvc |
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(UserVehicleController.class)
class MyControllerTests {
@Autowired
private MockMvc mvc;
@MockBean
private UserVehicleService userVehicleService;
@Test
void testExample() throws Exception {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
}
}
자동 구성요소(예: 서슬릿 필터를 적용해야 하는 경우)를 구성해야 하는 경우 이노션에서 특성을 사용할 수 있습니다. @AutoConfigureMockMvc |
HtmlUnit 또는 셀레늄을 사용하는 경우 자동 구성은 HtmlUnit 콩 및/또는 셀레늄 콩을 제공합니다. 다음 예제에서는 HtmlUnit을 사용합니다.WebClient
WebDriver
import com.gargoylesoftware.htmlunit.*;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
@WebMvcTest(UserVehicleController.class)
class MyHtmlUnitTests {
@Autowired
private WebClient webClient;
@MockBean
private UserVehicleService userVehicleService;
@Test
void testExample() throws Exception {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
}
}
기본적으로 스프링 부트은 각 테스트 후 드라이버가 종료되고 새 인스턴스가 주입되도록 특수 "범위"에 콩을 넣습니다. 이 동작을 원하지 않는 경우 정의에 추가할 수 있습니다. WebDriver @Scope("singleton") WebDriver @Bean |
Spring Boot에서 만든 범위는 동일한 이름의 사용자 정의 범위를 대체합니다. 사용자 고유의 범위를 정의하면. webDriver webDriver @WebMvcTest |
클래스패스에 스프링 시큐리티가 있는 경우 콩도 스캔합니다. 이러한 테스트에 대해 보안을 완전히 사용하지 않도록 설정하는 대신 Spring Security의 테스트 지원을 사용할 수 있습니다. 스프링 시큐리티의 지원 사용에 대한 자세한 내용은 스프링 보안 방법 섹션에서 확인할 수 있습니다.@WebMvcTest
WebSecurityConfigurer
MockMvc
때로는 스프링 MVC 테스트를 작성하는 것만으로는 충분하지 않습니다. 스프링 부트을 사용하면 실제 서버에서 전체 종단간 테스트를 실행하는 데 도움이 될 수 있습니다. |
자동 구성 스프링 웹플럭스 테스트
Spring WebFlux 컨트롤러가 예상대로 작동하는지 테스트하려면 어플을 사용할 수 있습니다. 스프링 웹플럭스 인프라를 자동 구성하고 스캔한 콩을 , , , , 및 로 제한합니다. 주석을 사용할 때 일반 콩은 스캔되지 않습니다.@WebFluxTest
@WebFluxTest
@Controller
@ControllerAdvice
@JsonComponent
Converter
GenericConverter
WebFilter
WebFluxConfigurer
@Component
@WebFluxTest
활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @WebFluxTest |
Jackson과 같은 추가 구성 요소를 등록해야 하는 경우 테스트에서 추가 구성 클래스를 가져올 수 있습니다. Module @Import |
종종 단일 컨트롤러로 제한되며 필요한 공동 작업자에 대한 모의 구현을 제공하기 위해 부기와 함께 사용됩니다.@WebFluxTest
@MockBean
@WebFluxTest
또한 웹테스트클라이언트를
자동으로 구성하여 전체 HTTP 서버를 시작하지 않고도 웹플렉스 컨트롤러를 신속하게 테스트할 수 있는 강력한 방법을 제공합니다.
또한 비-(예:)로 자동 구성할 수 있습니다. 다음 예제에서는 둘 다를 사용하는 클래스와 다음을 보여 주며. WebTestClient @WebFluxTest @SpringBootTest @AutoConfigureWebTestClient @WebFluxTest WebTestClient |
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.reactive.server.WebTestClient;
@WebFluxTest(UserVehicleController.class)
class MyControllerTests {
@Autowired
private WebTestClient webClient;
@MockBean
private UserVehicleService userVehicleService;
@Test
void testExample() throws Exception {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
this.webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Honda Civic");
}
}
이 설정은 웹플럭스 응용 프로그램에서만 지원되며, 현재 웹플럭스에서만 사용할 수 있습니다. WebTestClient |
@WebFluxTest 기능 웹 프레임워크를 통해 등록된 경로를 검색할 수 없습니다. 컨텍스트에서 콩을 테스트하려면 를 통해 또는 사용 하 여 자신을 가져오는 것이 좋습니다. RouterFunction RouterFunction @Import @SpringBootTest |
@WebFluxTest 형식의 사용자 지정 보안 구성을 검색할 수 없습니다. 테스트에 포함하려면 bean을 통해 등록하거나 사용하는 구성을 가져와야 합니다. @Bean SecurityWebFilterChain @Import @SpringBootTest |
때로는 스프링 웹 플럭스 테스트를 작성하는 것만으로는 충분하지 않습니다. 스프링 부트을 사용하면 실제 서버에서 전체 종단간 테스트를 실행하는 데 도움이 될 수 있습니다. |
자동 구성 데이터 JPA 테스트
이 애니프런서를 사용하여 JPA 응용 프로그램을 테스트할 수 있습니다. 기본적으로 클래스를 검사하고 스프링 데이터 JPA 리포지토리를 구성합니다. 클래스경로에서 임베디드 데이터베이스를 사용할 수 있는 경우 데이터베이스도 구성합니다. 일반 콩은 에로드되지 않습니다.@DataJpaTest
@Entity
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @DataJpaTest |
기본적으로 데이터 JPA 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다. 자세한 내용은 스프링 프레임워크 참조 설명서의 관련 섹션을 참조하십시오. 그렇지 않은 경우 테스트 또는 전체 클래스의 트랜잭션 관리를 다음과 같이 비활성화할 수 있습니다.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class ExampleNonTransactionalTests {
}
데이터 JPA 테스트는 테스트를 위해 특별히 설계된 표준 JPA에 대한 대안을 제공하는 TestEntityManager
콩을 주입할 수도 있습니다. 인스턴스 외부에서 사용하려는 경우 항목 표시기를 사용할 수도 있습니다. 필요한 경우 A도 사용할 수 있습니다. 다음 예제에서는 사용 중의 부가가 표시됩니다.EntityManager
TestEntityManager
@DataJpaTest
@AutoConfigureTestEntityManager
JdbcTemplate
@DataJpaTest
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.orm.jpa.*;
import static org.assertj.core.api.Assertions.*;
@DataJpaTest
class ExampleRepositoryTests {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository repository;
@Test
void testExample() throws Exception {
this.entityManager.persist(new User("sboot", "1234"));
User user = this.repository.findByUsername("sboot");
assertThat(user.getUsername()).isEqualTo("sboot");
assertThat(user.getVin()).isEqualTo("1234");
}
}
메모리 내 임베디드 데이터베이스는 빠르고 설치가 필요하지 않기 때문에 일반적으로 테스트에 적합합니다. 그러나 다음 예제와 같이 다음 예제와 같이 다음 예제와 같이 부조를 사용할 수 있는 실제 데이터베이스에 대한 테스트를 실행하는 것을 선호합니다.@AutoConfigureTestDatabase
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
class ExampleRepositoryTests {
// ...
}
자동 구성 JDBC 테스트
@JdbcTest
스프링 데이터 JDBC만 필요로 하고 사용하지 않는 테스트용과 유사합니다. 기본적으로 메모리 내 임베디드 데이터베이스와 .를 구성합니다. 일반 콩은 에로드되지 않습니다.@DataJpaTest
DataSource
JdbcTemplate
@Component
ApplicationContext
활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @JdbcTest |
기본적으로 JDBC 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다. 자세한 내용은 스프링 프레임워크 참조 설명서의 관련 섹션을 참조하십시오. 그렇지 않은 경우 테스트 또는 전체 클래스의 트랜잭션 관리를 다음과 같이 비활성화할 수 있습니다.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class ExampleNonTransactionalTests {
}
실제 데이터베이스에 대해 테스트를 실행하려는 경우. ("자동 구성된 데이터 JPA 테스트"를참조하십시오.@AutoConfigureTestDatabase
DataJpaTest
자동 구성 데이터 JDBC 테스트
@DataJdbcTest
스프링 데이터 JDBC 리포지토리를 사용하는 테스트와 유사하지만 입니다. 기본적으로 메모리 내 임베디드 데이터베이스, 스프링 데이터 JDBC 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다.@JdbcTest
JdbcTemplate
@Component
ApplicationContext
활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @DataJdbcTest |
기본적으로 데이터 JDBC 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다. 자세한 내용은 스프링 프레임워크 참조 설명서의 관련 섹션을 참조하십시오. 그렇지 않은 경우 JDBC 예제와 같이테스트 또는 전체 테스트 클래스의 트랜잭션 관리를 비활성화할 수 있습니다.
실제 데이터베이스에 대해 테스트를 실행하려는 경우. ("자동 구성된 데이터 JPA 테스트"를참조하십시오.@AutoConfigureTestDatabase
DataJpaTest
자동 구성 jOOQ 테스트
jOOQ 관련 테스트와 유사한 방식으로 사용할 수 있습니다. jOOQ가 데이터베이스 스키마에 해당하는 Java 기반 스키마에 크게 의존하므로 기존 스키마가 사용됩니다. 메모리 내 데이터베이스로 바꾸려면 해당 설정을 재정의하는 데 사용할 수 있습니다. (스프링 부트과 jOOQ를 사용하는 것에 대한 자세한 내용은"jOOQ 사용",이 장 의 초기 참조). 일반 콩은 에로드되지 않습니다.@JooqTest
@JdbcTest
DataSource
@AutoConfigureTestDatabase
@Component
ApplicationContext
활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @JooqTest |
@JooqTest
를 구성합니다. 일반 콩은 에로드되지 않습니다. 다음 예제에서는 사용 중의 부가가 표시됩니다.DSLContext
@Component
ApplicationContext
@JooqTest
import org.jooq.DSLContext;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.jooq.JooqTest;
@JooqTest
class ExampleJooqTests {
@Autowired
private DSLContext dslContext;
}
JOOQ 테스트는 기본적으로 각 테스트의 끝에 트랜잭션 및 롤백됩니다. 그렇지 않은 경우 JDBC 예제와 같이테스트 또는 전체 테스트 클래스의 트랜잭션 관리를 비활성화할 수 있습니다.
자동 구성 데이터 MongoDB 테스트
MongoDB 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 메모리 내 임베디드 MongoDB(사용 가능한 경우)를 구성하고, 클래스에 대한 스캔을 구성하고, 스프링 데이터 MongoDB 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다. (스프링 부트과 몽고DB를 사용하는 것에 대한 자세한 내용은,이 장에서 이전"MongoDB"를참조하십시오.)@DataMongoTest
MongoTemplate
@Document
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @DataMongoTest |
다음 클래스에는 사용 중의 부가가 표시됩니다.@DataMongoTest
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.data.mongodb.core.MongoTemplate;
@DataMongoTest
class ExampleDataMongoTests {
@Autowired
private MongoTemplate mongoTemplate;
//
}
메모리 내 임베디드 MongoDB는 일반적으로 테스트에 적합하며, 빠르며 개발자 설치가 필요하지 않기 때문에 일반적으로 잘 작동합니다. 그러나 실제 MongoDB 서버에 대한 테스트를 실행하는 것을 선호하는 경우 다음 예제와 같이 포함된 MongoDB 자동 구성을 제외해야 합니다.
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
@DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)
class ExampleDataMongoNonEmbeddedTests {
}
자동 구성 데이터 Neo4j 테스트
Neo4j 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 포함된 메모리 내 Neo4j(임베디드 드라이버를 사용할 수 있는 경우), 클래스에 대한 스캔 및 스프링 데이터 Neo4j 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다. (스프링 부트와 네오4J를 사용하는 것에 대한 자세한 내용은,이 장에서 이전"네오4j"를참조하십시오.)@DataNeo4jTest
@NodeEntity
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @DataNeo4jTest |
다음 예제에서는 스프링 부트에서 Neo4J 테스트를 사용하기 위한 일반적인 설정을 보여 주겠습니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
@DataNeo4jTest
class ExampleDataNeo4jTests {
@Autowired
private YourRepository repository;
//
}
기본적으로 Data Neo4j 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다. 자세한 내용은 스프링 프레임워크 참조 설명서의 관련 섹션을 참조하십시오. 그렇지 않은 경우 테스트 또는 전체 클래스의 트랜잭션 관리를 다음과 같이 비활성화할 수 있습니다.
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@DataNeo4jTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class ExampleNonTransactionalTests {
}
자동 구성 데이터 재배포 테스트
Redis 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 클래스를 검사하고 스프링 데이터 Redis 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다. (스프링 부트과 Redis를 사용하는 것에 대한 자세한 내용은 이 장의 이전"Redis"를참조하십시오.)@DataRedisTest
@RedisHash
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @DataRedisTest |
다음 예제에서는 사용 중의 부가가 표시됩니다.@DataRedisTest
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest;
@DataRedisTest
class ExampleDataRedisTests {
@Autowired
private YourRepository repository;
//
}
자동 구성 데이터 LDAP 테스트
LDAP 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 메모리 내 임베디드 LDAP(사용 가능한 경우)를 구성하고, 클래스에 대한 스캔을 구성하고, 스프링 데이터 LDAP 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다. (스프링 부트LDAP사용에 대한 자세한 내용은 이 장의"LDAP"를참조하십시오.)@DataLdapTest
LdapTemplate
@Entry
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @DataLdapTest |
다음 예제에서는 사용 중의 부가가 표시됩니다.@DataLdapTest
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
import org.springframework.ldap.core.LdapTemplate;
@DataLdapTest
class ExampleDataLdapTests {
@Autowired
private LdapTemplate ldapTemplate;
//
}
메모리 내 내장 LDAP는 일반적으로 테스트에 적합하며, 빠르며 개발자 설치가 필요하지 않기 때문에 일반적으로 잘 작동합니다. 그러나 실제 LDAP 서버에 대한 테스트를 실행하는 것을 선호하는 경우 다음 예제와 같이 포함된 LDAP 자동 구성을 제외해야 합니다.
import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
@DataLdapTest(excludeAutoConfiguration = EmbeddedLdapAutoConfiguration.class)
class ExampleDataLdapNonEmbeddedTests {
}
자동 구성 REST 클라이언트
이 노기를 사용하여 REST 클라이언트를 테스트할 수 있습니다. 기본적으로 잭슨, GSON 및 Jsonb 지원을 자동으로 구성하고 구성하고 에 대한 지원을 추가합니다. 일반 콩은 에로드되지 않습니다.@RestClientTest
RestTemplateBuilder
MockRestServiceServer
@Component
ApplicationContext
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @RestClientTest |
테스트하려는 특정 원두는 다음 예제와 같이 의 또는 특성을 사용하여 지정해야 합니다.value
components
@RestClientTest
@RestClientTest(RemoteVehicleDetailsService.class)
class ExampleRestClientTest {
@Autowired
private RemoteVehicleDetailsService service;
@Autowired
private MockRestServiceServer server;
@Test
void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails()
throws Exception {
this.server.expect(requestTo("/greet/details"))
.andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
String greeting = this.service.callRestService();
assertThat(greeting).isEqualTo("hello");
}
}
자동 구성 스프링 REST 문서 테스트
이 애니핀을 사용하여 모의 MVC, REST 안심 또는 WebTestClient를 사용하여 테스트에서 스프링 REST 문서를 사용할 수 있습니다. 스프링 REST 문서의 JUnit 확장에 대한 필요성을 제거합니다.@AutoConfigureRestDocs
@AutoConfigureRestDocs
기본 출력 디렉토리를 재정의하는 데 사용할 수 있습니다(Maven을 사용 중이거나 Gradle을 사용하는 경우). 문서화된 URI에 나타나는 호스트, 구성표 및 포트를 구성하는 데도 사용할 수 있습니다.target/generated-snippets
build/generated-snippets
모의 MVC를 통해 자동 구성된 스프링 REST 문서 테스트
@AutoConfigureRestDocs
콩을 사용자 지정하여 스프링 REST 문서를 사용합니다. 다음 예제와 같이 모의 MVC 및 스프링 REST 문서를 사용할 때와 같이 일반적으로 테스트에 사용하여 주입하고 사용할 수 있습니다.MockMvc
@Autowired
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
class UserDocumentationTests {
@Autowired
private MockMvc mvc;
@Test
void listUsers() throws Exception {
this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andDo(document("list-users"));
}
}
스프링 REST 문서 구성을 보다 더 많이 제어해야 하는 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocs
RestDocsMockMvcConfigurationCustomizer
@TestConfiguration
static class CustomizationConfiguration
implements RestDocsMockMvcConfigurationCustomizer {
@Override
public void customize(MockMvcRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
매개 변수 출력 디렉토리에 대한 스프링 REST 문서 지원을 사용하려면 콩을 만들 수 있습니다. 자동 구성은 이 결과 처리기로 호출하므로 각 호출에서 기본 스니펫이 자동으로 생성됩니다. 다음 예제에서는 정의되는 예제를 보여 주겠습니다.RestDocumentationResultHandler
alwaysDo
MockMvc
RestDocumentationResultHandler
@TestConfiguration(proxyBeanMethods = false)
static class ResultHandlerConfiguration {
@Bean
public RestDocumentationResultHandler restDocumentation() {
return MockMvcRestDocumentation.document("{method-name}");
}
}
웹테스트클라이언트를 통해 자동 구성된 스프링 REST 문서 테스트
@AutoConfigureRestDocs
또한 함께 사용할 수 있습니다. 다음 예제와 같이 사용 하 여 테스트에 사용 하 여 사용 하 여 사용 하 여 사용 하 여 사용 하 여 사용할 수 있습니다., 다음 예제에서 와 같이:WebTestClient
@Autowired
@WebFluxTest
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
@WebFluxTest
@AutoConfigureRestDocs
class UsersDocumentationTests {
@Autowired
private WebTestClient webTestClient;
@Test
void listUsers() {
this.webTestClient.get().uri("/").exchange().expectStatus().isOk().expectBody()
.consumeWith(document("list-users"));
}
}
스프링 REST 문서 구성을 보다 더 많이 제어해야 하는 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocs
RestDocsWebTestClientConfigurationCustomizer
@TestConfiguration(proxyBeanMethods = false)
public static class CustomizationConfiguration implements RestDocsWebTestClientConfigurationCustomizer {
@Override
public void customize(WebTestClientRestDocumentationConfigurer configurer) {
configurer.snippets().withEncoding("UTF-8");
}
}
REST 가 보장된 자동 구성 스프링 REST 문서 테스트
@AutoConfigureRestDocs
스프링 REST 문서를 사용하도록 미리 구성된 콩을 테스트에 사용할 수 있습니다. 다음 예제와 같이 REST 안심 및 스프링 REST 문서를 사용할 때와 같이 일반적으로 테스트에 사용하여 주입하고 사용할 수 있습니다.RequestSpecification
@Autowired
import io.restassured.specification.RequestSpecification;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.web.server.LocalServerPort;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.is;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs
class UserDocumentationTests {
@Test
void listUsers(@Autowired RequestSpecification documentationSpec, @LocalServerPort int port) {
given(documentationSpec).filter(document("list-users")).when().port(port).get("/").then().assertThat()
.statusCode(is(200));
}
}
스프링 REST 문서 구성에 대한 더 많은 제어가 필요한 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocs
RestDocsRestAssuredConfigurationCustomizer
@TestConfiguration(proxyBeanMethods = false)
public static class CustomizationConfiguration implements RestDocsRestAssuredConfigurationCustomizer {
@Override
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
자동 구성 스프링 웹 서비스 테스트
Spring Web Services 프로젝트를 사용하여 콜 웹 서비스를 사용하는 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 모의 콩을 구성하고 자동으로 사용자 정의할 수 있습니다. 스프링 부트과 함께 웹 서비스를 사용하는 자세한 내용은"웹 서비스"를참조하세요.@WebServiceClientTest
WebServiceServer
WebServiceTemplateBuilder
활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @WebServiceClientTest |
다음 예제에서는 사용 중의 부가가 표시됩니다.@WebServiceClientTest
@WebServiceClientTest(ExampleWebServiceClient.class)
class WebServiceClientIntegrationTests {
@Autowired
private MockWebServiceServer server;
@Autowired
private ExampleWebServiceClient client;
@Test
void mockServerCall() {
this.server.expect(payload(new StringSource("<request/>"))).andRespond(
withPayload(new StringSource("<response><status>200</status></response>")));
assertThat(this.client.test()).extracting(Response::getStatus).isEqualTo(200);
}
}
추가 자동 구성 및 슬라이싱
각 조각은 슬라이스의 일부로 포함해야 하는 자동 구성을 정의하는 하나 이상의 주석을 제공합니다. 사용자 지정 어그란을 만들거나 다음 예제와 같이 테스트에 추가하기만 하면 추가 자동 구성을 추가할 수 있습니다.@AutoConfigure…
@AutoConfigure…
@ImportAutoConfiguration
@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration.class)
class ExampleJdbcTests {
}
일반 어노기를 사용하여 스프링 부트에서 특정 방식으로 처리되는 자동 구성을 가져오지 않도록 해야 합니다. @Import |
사용자 구성 및 슬라이싱
그런 다음 응용 프로그램의 기본 클래스에 해당 기능의 특정 영역에 특정한 구성 설정을 사용하지 않는 것이 중요합니다.
스프링 배치를 사용하고 있고 자동 구성에 의존한다고 가정합니다. 다음과 같이 정의할 수 있습니다.@SpringBootApplication
@SpringBootApplication
@EnableBatchProcessing
public class SampleApplication { ... }
이 클래스는 테스트의 소스 구성이므로 모든 슬라이스 테스트는 실제로 스프링 배치를 시작하려고 시도하므로 원하는 것이 아닙니다. 권장되는 방법은 다음 예제와 같이 해당 영역별 구성을 응용 프로그램과 동일한 수준에서 별도의 클래스로 이동하는 것입니다.@Configuration
@Configuration(proxyBeanMethods = false)
@EnableBatchProcessing
public class BatchConfiguration { ... }
응용 프로그램의 복잡성에 따라 사용자 지정에 대한 단일 클래스 또는 도메인 영역당 클래스가 하나있을 수 있습니다. 후자의 방법을 사용하면 필요한 경우 추가 기능을 사용하여 테스트 중 하나에서 사용할 수 있습니다. @Configuration @Import |
테스트 조각은 클래스를 스캔에서 제외합니다. 예를 들어, 다음 구성에는 테스트 슬라이스에 의해 로드된 응용 프로그램 컨텍스트에 지정된 콩이 포함되지 않습니다.@Configuration
@WebMvcTest
WebMvcConfigurer
@Configuration
public class WebConfiguration {
@Bean
public WebMvcConfigurer testConfigurer() {
return new WebMvcConfigurer() {
...
};
}
}
그러나 아래 구성으로 인해 테스트 슬라이스에 의해 사용자 지정이 로드됩니다.WebMvcConfigurer
@Component
public class TestWebMvcConfigurer implements WebMvcConfigurer {
...
}
혼란의 또 다른 원인은 클래스 패스 스캐닝입니다. 코드를 합리적인 방식으로 구조화하는 동안 추가 패키지를 스캔해야 한다고 가정합니다. 응용 프로그램은 다음 코드와 유사할 수 있습니다.
@SpringBootApplication
@ComponentScan({ "com.example.app", "org.acme.another" })
public class SampleApplication { ... }
이렇게 하면 선택한 조각에 관계없이 해당 두 패키지를 스캔하는 부작용으로 기본 구성 요소 검색 지시문을 효과적으로 재정의합니다. 예를 들어 응용 프로그램의 구성 요소 및 사용자 구성을 갑자기 검사하는 것 같습니다. 다시 말하지만 사용자 지정 지시문을 별도의 클래스로 이동하면 이 문제를 해결할 수 있습니다.@DataJpaTest
이 옵션이 아닌 경우 대신 사용할 수 있도록 테스트 계층 구조의 어딘가에 만들 수 있습니다. 또는 테스트에 대한 원본을 지정하여 기본 원본을 찾는 동작을 비활성화할 수 있습니다. @SpringBootConfiguration |
스포크를 사용하여 스프링 부트 응용 프로그램을 테스트합니다.
Spock을 사용하여 스프링 부트 응용 프로그램을 테스트하려면 응용 프로그램의 빌드에 Spock 모듈에 대한 종속성을 추가해야 합니다. 스프링의 테스트 프레임워크를 스포크에 통합합니다. Spock의 스프링 프레임워크 및 스프링 부트 통합을 개선하기 위해 Spock 1.2 이상을 사용하는 것이 좋습니다. 자세한 내용은 Spock의 스프링 모듈에 대한 설명서를 참조하십시오.spock-spring
spock-spring
4.26.4. 테스트 유틸리티
응용 프로그램을 테스트할 때 일반적으로 유용한 몇 가지 테스트 유틸리티 클래스는 의 일부로 패키지됩니다.spring-boot
컨피파일응용컨텍스트이더라이저
ConfigFileApplicationContextInitializer
스프링 부트 파일을 로드하기 위해 테스트에 적용할 수 있는 것입니다. 다음 예제와 같이 제공되는 전체 기능 집합이 필요하지 않을 때 사용할 수 있습니다.ApplicationContextInitializer
application.properties
@SpringBootTest
@ContextConfiguration(classes = Config.class,
initializers = ConfigFileApplicationContextInitializer.class)
단독으로 사용하면 주입에 대한 지원이 제공되지 않습니다. 유일한 임무는 파일이 스프링에 로드되도록하는 것입니다. 지원을 위해 추가로 구성하거나 사용하는 것이 필요하며, 이 중 하나를 자동으로 구성해야 합니다. ConfigFileApplicationContextInitializer @Value("${…}") application.properties Environment @Value PropertySourcesPlaceholderConfigurer @SpringBootTest |
테스트속성값
TestPropertyValues
또는 에 속성을 빠르게 추가할 수 있습니다. 다음과 같이 문자열로 호출할 수 있습니다.ConfigurableEnvironment
ConfigurableApplicationContext
key=value
TestPropertyValues.of("org=Spring", "name=Boot").applyTo(env);
출력 캡처
OutputCapture
캡처 및 출력에 사용할 수 있는 JUnit입니다. 다음과 같이 테스트 클래스 생성자 또는 테스트 메서드에 인수로 추가 및 삽입을 사용하려면 다음을 따르세요.Extension
System.out
System.err
@ExtendWith(OutputCaptureExtension.class)
CapturedOutput
@ExtendWith(OutputCaptureExtension.class)
class OutputCaptureTests {
@Test
void testName(CapturedOutput output) {
System.out.println("Hello World!");
assertThat(output).contains("World");
}
}
테스트레스트템플릿
TestRestTemplate
통합 테스트에 유용한 Spring's에 대한 편의성 대안입니다. 바닐라 템플릿 또는 기본 HTTP 인증을 보내는 템플릿(사용자 이름과 암호)을 얻을 수 있습니다. 두 경우 모두 템플릿은 서버 측 오류에 예외를 던지지 않음으로써 테스트 친화적인 방식으로 행동합니다.RestTemplate
Spring Framework 5.0은 WebFlux 통합 테스트와 WebFlux 및 MVC 종단 간 테스트모두에적합한 새로운 것을 제공합니다. 그것은 어설션에 대한 유창한 API를 제공합니다, 와달리. WebTestClient TestRestTemplate |
아파치 HTTP 클라이언트(버전 4.3.2 이상)를 사용하는 것이 권장되지만 필수는 아닙니다. 클래스 경로에 있는 경우 클라이언트를 적절하게 구성하여 응답합니다. 아파치의 HTTP 클라이언트를 사용하는 경우 몇 가지 추가 테스트 친화적인 기능이 활성화됩니다.TestRestTemplate
- 리디렉션은 따르지 않습니다(응답 위치를 어설션할 수 있음).
- 쿠키는 무시됩니다(템플릿은 상태 비)
TestRestTemplate
다음 예제와 같이 통합 테스트에서 직접 인스턴스화할 수 있습니다.
public class MyTest {
private TestRestTemplate template = new TestRestTemplate();
@Test
public void testRequest() throws Exception {
HttpHeaders headers = this.template.getForEntity(
"https://myhost.example.com/example", String.class).getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}
}
또는, 당신은 와 함께 또는, 당신은 완전히 구성된 주입하고 그것을 사용하여 시작할 수 있습니다. 필요한 경우 콩을 통해 추가 사용자 지정을 적용할 수 있습니다. 호스트 및 포트를 지정하지 않는 모든 URL은 다음 예제와 같이 포함된 서버에 자동으로 연결됩니다.@SpringBootTest
WebEnvironment.RANDOM_PORT
WebEnvironment.DEFINED_PORT
TestRestTemplate
RestTemplateBuilder
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleWebClientTests {
@Autowired
private TestRestTemplate template;
@Test
void testRequest() {
HttpHeaders headers = this.template.getForEntity("/example", String.class).getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}
@TestConfiguration(proxyBeanMethods = false)
static class Config {
@Bean
RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
.setReadTimeout(Duration.ofSeconds(1));
}
}
}
Spring Boot Reference DocumentationPhillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott FrederickLegal2.3.1.RELEASE Copyright © 2012-2020 Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. |
출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-testing
'IT > SpringBoot' 카테고리의 다른 글
스프링 부트 #4.30. 코틀린 지원 (0) | 2020.06.16 |
---|---|
스프링 부트 #4.27-4.30. 웹 소켓 등 (0) | 2020.06.16 |
스프링 부트 #4.15-25. REST서비스 호출 외 (0) | 2020.06.16 |
스프링 부트 #4.14. 메시징 (0) | 2020.06.15 |
스프링 부트 #4.13. 캐싱 (0) | 2020.06.15 |