본문 바로가기

IT/SpringBoot

스프링 부트 #4.26. 테스트

반응형
더보기

4.26. 테스트

Spring Boot는 응용 프로그램을 테스트할 때 도움이 되는 여러 유틸리티와 주석을 제공합니다. 테스트 지원은 핵심 항목을 포함하고 테스트를 위한 자동 구성을 지원하는 두 모듈에서 제공됩니다.spring-boot-testspring-boot-test-autoconfigure

대부분의 개발자는 스프링 부트 테스트 모듈뿐만 아니라 JUnit 목성, AssertJ, Hamcrest 및 기타 유용한 라이브러리를 모두 가져오는 "스타터"를 사용합니다.spring-boot-starter-test

 

스타터는 또한 당신이 JUnit 4와 JUnit 5 테스트를 모두 실행할 수 있도록 빈티지 엔진을 제공합니다. 테스트를 JUnit 5로 마이그레이션한 경우 다음 예제와 같이 JUnit 4 지원을 제외해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.26.1. 테스트 범위 종속성

"스타터"(에서)에는 다음과 같은 라이브러리가 포함되어 있습니다.spring-boot-starter-testtestscope

  • JUnit 5 (JUnit 4와의 후진 호환성을 위한 빈티지 엔진 포함): 장치 테스트 Java 애플리케이션을 위한 사실상 표준입니다.
  • 스프링 테스트 및 스프링 부트 테스트: 스프링 부트 응용 프로그램에 대한 유틸리티 및 통합 테스트 지원.
  • AssertJ: 유창한 어설션 라이브러리.
  • 함크레스트: 매치 오브젝트 라이브러리(제약 조건 또는 조건자라고도 함).
  • 모키토: 자바 조롱 프레임 워크.
  • JSONassert: JSON에 대한 어설션 라이브러리.
  • JsonPath: JSON용 XPath.

일반적으로 이러한 공통 라이브러리는 테스트를 작성할 때 유용할 수 있습니다. 이러한 라이브러리가 필요에 맞지 않는 경우 고유한 테스트 종속성을 추가할 수 있습니다.

4.26.2. 스프링 애플리케이션 테스트

종속성 주입의 주요 장점 중 하나는 코드를 단위 테스트가 더 쉽게 만들어야 한다는 것입니다. 스프링을 포함하지 않고 연산자사용으로 객체를 인스턴스화할 수 있습니다. 실제 종속성 대신 모의 개체를 사용할 수도 있습니다.new

종종 장치 테스트를 넘어 스프링과 함께 통합 테스트를 시작해야 하는 경우가 많습니다. 응용 프로그램을 배포하거나 다른 인프라에 연결할 필요 없이 통합 테스트를 수행할 수 있습니다.ApplicationContext

Spring Framework에는 이러한 통합 테스트를 위한 전용 테스트 모듈이 포함되어 있습니다. 종속성을 직접 선언하거나 "스타터"를 사용하여 전이적으로 가져올 수 있습니다.org.springframework:spring-testspring-boot-starter-test

이전에 모듈을 사용하지 않은 경우 Spring Framework 참조 설명서의 관련 섹션을 읽는 것으로 시작해야 합니다.spring-test

4.26.3. 스프링 부트 응용 프로그램 테스트

스프링 부트 응용 프로그램은 스프링, 그래서 아무것도 매우 특별한 당신이 일반적으로 바닐라 스프링 컨텍스트로 무엇을 할 것 이상으로 테스트하기 위해 수행 할 수 없습니다.ApplicationContext

  스프링 부트의 외부 속성, 로깅 및 기타 기능은 기본적으로 컨텍스트에 설치됩니다. SpringApplication

스프링 부트은 스프링 부트 기능이 필요할 때 표준 어노션의 대안으로 사용할 수 있는 어노피를 제공합니다. 이 애니쳐지는 SpringApplication을통해 테스트에 사용된 응용 프로그램 컨텍스트를 만들어 작동합니다. 응용 프로그램의 보다 구체적인 조각을 테스트하기 위해 여러 가지 다른 주석도 제공됩니다.@SpringBootTestspring-test@ContextConfiguration@SpringBootTest

  JUnit 4를 사용하는 경우 테스트에 추가하는 것을 잊지 마세요. JUnit 5를 사용하는 경우 해당 주석을 추가할 필요가 없으며 다른 주석은 이미 주석이 추가됩니다. @RunWith(SpringRunner.class)@ExtendWith(SpringExtension.class)@SpringBootTest@…Test

기본적으로 서버가 시작되지 않습니다. 테스트 실행 방식을 더 구체화하기 위해 속성을 사용할 수 있습니다.@SpringBootTestwebEnvironment@SpringBootTest

  • MOCK(기본값) : 웹을 로드하고 모의 웹 환경을 제공합니다. 이 어노월션을 사용할 때임베디드 서버가 시작되지 않습니다. 클래스경로에서 웹 환경을 사용할 수 없는 경우 이 모드는 투명하게 다시 일반 비웹을 만드는 것으로 돌아갑니다. 웹 응용 프로그램의 모의 기반 테스트를 위해 @AutoConfigureMockMvc 또는 @AutoConfigureWebTestClient 함께 사용할 수 있습니다.ApplicationContextApplicationContext
  • RANDOM_PORT: 로드하고 실제 웹 환경을 제공합니다. 임베디드 서버가 시작되고 임의포트에서 수신 대기합니다.WebServerApplicationContext
  • DEFINED_PORT: 로드하고 실제 웹 환경을 제공합니다. 임베디드 서버가 정의된 포트(사용자에서) 또는 기본 포트에서 시작되고 수신대기됩니다.WebServerApplicationContextapplication.properties8080
  • NONE: 사용 하 여 로드 하지만 웹 환경 (모의 또는 다른)를 제공 하지 않습니다.ApplicationContextSpringApplication
  테스트가 있는 경우 기본적으로 각 테스트 메서드의 끝에 트랜잭션을 롤백합니다. 그러나 이 배열을 실제 서슬레 환경을 사용하거나 암시적으로 제공하는 것처럼 HTTP 클라이언트와 서버는 별도의 스레드에서 실행되므로 별도의 트랜잭션에서 실행됩니다. 이 경우 서버에서 시작된 트랜잭션이 롤백되지 않습니다. @TransactionalRANDOM_PORTDEFINED_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

 

기본 구성 요소 검사 구성은 슬라이스가 예상대로 작동하는지 확인하는 데 사용되는 필터를 제외합니다. -에 추가된 클래스에서 명시적 지시문을 사용하는 경우 해당 필터가 비활성화됩니다. 슬라이스를 사용하는 경우 다시 정의해야 합니다.@SpringBootApplication@ComponentScan@SpringBootApplication

기본 구성을 사용자 지정하려면 중첩된 클래스를 사용할 수 있습니다. 응용 프로그램의 기본 구성 대신 사용되는 중첩 클래스와 달리 중첩 클래스는 응용 프로그램의 기본 구성 외에도 사용됩니다.@TestConfiguration@Configuration@TestConfiguration

  스프링의 테스트 프레임워크는 테스트 간에 응용 프로그램 컨텍스트를 캐시합니다. 따라서 테스트가 동일한 구성을 공유하는 한(검색 방식에 관계없이) 컨텍스트를 로드하는 데 시간이 많이 소요될 수 있는 프로세스는 한 번만 발생합니다.
테스트 구성 제외

응용 프로그램에서 구성 요소 검색을 사용하는 경우(예: 사용 중이거나 사용중이면) 특정 테스트에 대해서만 만든 최상위 구성 클래스가 실수로 어디서나 픽업될 수 있습니다.@SpringBootApplication@ComponentScan

앞에서 보았듯이테스트의 내부 클래스에서 기본 구성을 사용자 지정하는 데 사용할 수 있습니다. 최상위 클래스에 배치할 때 스캔을 통해 클래스를 선택해서는 안 된다는 것을 나타냅니다. 그런 다음 다음 예제와 같이 필요한 경우 해당 클래스를 명시적으로 가져올 수 있습니다.@TestConfiguration@TestConfigurationsrc/test/java

@SpringBootTest
@Import(MyTestsConfiguration.class)
class MyTests {

    @Test
    void exampleTest() {
        ...
    }

}
  직접 사용하는 경우 (즉, 통과하지 않음) 당신은 그것으로 등록해야합니다. 자세한 내용은 Javadoc을 참조하십시오. @ComponentScan@SpringBootApplicationTypeExcludeFilter
응용 프로그램 인수 사용

응용 프로그램에서 인수를 예상하는 경우 특성을사용하여 주입할 수 있습니다.@SpringBootTestargs

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

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");
    }

}
사용자 정의 웹테스트클라이언트

콩을 사용자 정의하려면 콩을 구성합니다. 이러한 콩은 를 만드는 데 사용되는 것으로 호출됩니다.WebTestClientWebTestClientBuilderCustomizerWebTestClient.BuilderWebTestClient

JMX 사용

테스트 컨텍스트 프레임워크가 컨텍스트를 캐시하므로 동일한 구성 요소가 동일한 도메인에 등록되지 않도록 기본적으로 JMX가 비활성화됩니다. 이러한 테스트에 대한 액세스가 필요한 경우, 더러워 표시하는 것도 고려해 보십시오.MBeanServer

@ExtendWith(SpringExtension.class)
@SpringBootTest(properties = "spring.jmx.enabled=true")
@DirtiesContext
class SampleJmxTests {

    @Autowired
    private MBeanServer mBeanServer;

    @Test
    void exampleTest() {
        // ...
    }

}
콩을 조롱하고 감시

테스트를 실행할 때 응용 프로그램 컨텍스트 내에서 특정 구성 요소를 모의해야 하는 경우가 있습니다. 예를 들어 개발 중에 사용할 수 없는 일부 원격 서비스에 대한 외관이 있을 수 있습니다. 실제 환경에서 트리거하기 어려울 수 있는 오류를 시뮬레이션하려는 경우에도 Mocking이 유용할 수 있습니다.

스프링 부트에는 내부콩에 대한 Mockito 모의를 정의하는 데 사용할 수 있는 어노피가 포함되어 있습니다. 이 애니테션을 사용하여 새 콩을 추가하거나 단일 기존 콩 정의를 대체할 수 있습니다. 이 성기는 테스트 클래스, 테스트 내의 필드 또는 클래스 및 필드에서 직접 사용할 수 있습니다. 필드에서 사용할 경우 생성된 모의 인스턴스도 주입됩니다. 모의 콩은 각 테스트 방법 후에 자동으로 재설정됩니다.@MockBeanApplicationContext@Configuration

 

테스트가 스프링 부트의 테스트 주석 중 하나를 사용하는 경우(예: 이 기능이 자동으로 활성화됩니다) 다른 배열과 함께 이 기능을 사용하려면 다음 예제와 같이 수신기를 명시적으로 추가해야 합니다.@SpringBootTest

@TestExecutionListeners(MockitoTestExecutionListener.class)

다음 예제는 기존 빈을 모의 구현으로 대체합니다.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을 참조하십시오.@SpyBeanspy

  범위가 있는 콩에 대해 생성된 프록시와 같은 CGLib 프록시는 프록시 메서드를 로 선언합니다. 이렇게 하면 Mockito가 기본 구성에서 메서드를 조롱하거나 감시할 수 없으므로 올바르게 작동하지 않습니다. 이러한 콩을 조롱하거나 감시하려는 경우 응용 프로그램의 테스트 종속성에 추가하여 Mockito를 인라인 모의 메이커를 사용하도록 구성합니다. 이를 통해 모키토는 방법을 조롱하고 감시할 수 있습니다. finalfinalorg.mockito:mockito-inlinefinal
  Spring의 테스트 프레임워크는 테스트 간에 응용 프로그램 컨텍스트를 캐시하고 동일한 구성을 공유하는 테스트의 컨텍스트를 다시 사용하지만 캐시 키를 사용하거나 영향을 미치므로 컨텍스트 수가 증가할 가능성이 큽니까. @MockBean@SpyBean
  이름으로 매개 변수를 참조 하는 메서드와 콩을 감시 하는 데 사용 하는 경우 응용 프로그램을 컴파일 해야 합니다 . 이렇게 하면 콩이 스파이되면 캐싱 인프라에서 매개 변수 이름을 사용할 수 있습니다. @SpyBean@Cacheable-parameters
자동 구성 테스트

스프링 부트의 자동 구성 시스템은 응용 프로그램에 적합하지만 때로는 테스트에 너무 많이 할 수 있습니다. 응용 프로그램의 "슬라이스"를 테스트하는 데 필요한 구성 부분만 로드하는 데 도움이 됩니다. 예를 들어 Spring MVC 컨트롤러가 URL을 올바르게 매핑하고 해당 테스트에 데이터베이스 호출을 포함하지 않거나 JPA 엔터티를 테스트하려는 경우 해당 테스트가 실행될 때 웹 레이어에 관심이 없는지 테스트할 수 있습니다.

이 모듈에는 이러한 "슬라이스"를 자동으로 구성하는 데 사용할 수 있는 여러 주석이 포함되어 있습니다. 각각은 비슷한 방식으로 작동하여 자동 구성 설정을 사용자 지정하는 데 사용할 수 있는 주석과 하나 이상의 주석을 로드하는 주석을 제공합니다.spring-boot-test-autoconfigure@…​TestApplicationContext@AutoConfigure…​

  각 슬라이스는 구성 요소 스캔을 적절한 구성 요소로 제한하고 매우 제한된 자동 구성 클래스 집합을 로드합니다. 그 중 하나를 제외해야 하는 경우 대부분의 주석은 특성을 제공합니다. 또는 사용할 수 있습니다. @…​TestexcludeAutoConfiguration@ImportAutoConfiguration#exclude
  한 테스트에서 여러 주석을 사용하여 여러 개의 "슬라이스"를 포함하면 지원되지 않습니다. 여러 개의 "슬라이스"가 필요한 경우 주석 중 하나를 선택하고 다른 "슬라이스"의 주석을 손으로 포함합니다. @…​Test@…​Test@AutoConfigure…​
  표준 주석과 주석을 사용할 수도 있습니다. 응용 프로그램을 "슬라이싱"에 관심이 없지만 자동 구성된 테스트 빈 중 일부를 원하는 경우 이 조합을 사용할 수 있습니다. @AutoConfigure…​@SpringBootTest
자동 구성 JSON 테스트

JSON 직렬화 및 직렬화가 예상대로 작동하는지 테스트하려면 음표기를 사용할 수 있습니다. 사용 가능한 지원 되는 JSON 매퍼를 자동으로 구성, 다음 라이브러리 중 하나가 될 수 있는:@JsonTest@JsonTest

  • 잭슨, 어떤 콩과 어떤 잭슨 sObjectMapper@JsonComponentModule
  • Gson
  • Jsonb
  활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @JsonTest

자동 구성의 요소를 구성해야 하는 경우 이 노를 사용할 수 있습니다.@AutoConfigureJsonTesters

스프링 부트에는 JSONAssert 및 JsonPath 라이브러리와 함께 작업하는 AssertJ 기반 도우미가 포함되어 JSON이 예상대로 나타나는지 확인합니다. , 및 클래스는 각각 잭슨, 그손, Jsonb 및 문자열에 사용할 수 있습니다. 테스트 클래스의 모든 도우미 필드는 사용할 때일 수 있습니다. 다음 예제에서는 Jackson에 대한 테스트 클래스가 표시됩니다.JacksonTesterGsonTesterJsonbTesterBasicJsonTester@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를 사용하여 값이 지정된 조건과 일치한다고 주장할 수 있습니다. 예를 들어 다음 예제에서는 실제 숫자가 오프셋 내에서 가까운 플로트 값이라고 주장합니다.isEqualTosatisfies0.150.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@JsonComponentConverterGenericConverterFilterHandlerInterceptorWebMvcConfigurerHandlerMethodArgumentResolver@Component

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @WebMvcTest
  Jackson과 같은 추가 구성 요소를 등록해야 하는 경우 테스트에서 사용하여 추가 구성 클래스를 가져올 수 있습니다. Module@Import

종종 단일 컨트롤러로 제한되며 필요한 공동 작업자에 대한 모의 구현을 제공하기 위해 함께 사용됩니다.@WebMvcTest@MockBean

@WebMvcTest 또한 자동으로 구성된다. Mock MVC는 전체 HTTP 서버를 시작하지 않고도 MVC 컨트롤러를 신속하게 테스트할 수 있는 강력한 방법을 제공합니다.MockMvc

  또한 비-(예:)로 자동 구성할 수 있습니다. 다음 예제에서는 다음을 사용합니다. MockMvc@WebMvcTest@SpringBootTest@AutoConfigureMockMvcMockMvc
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을 사용합니다.WebClientWebDriver

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에서 만든 범위는 동일한 이름의 사용자 정의 범위를 대체합니다. 사용자 고유의 범위를 정의하면. webDriverwebDriver@WebMvcTest

클래스패스에 스프링 시큐리티가 있는 경우 콩도 스캔합니다. 이러한 테스트에 대해 보안을 완전히 사용하지 않도록 설정하는 대신 Spring Security의 테스트 지원을 사용할 수 있습니다. 스프링 시큐리티의 지원 사용에 대한 자세한 내용은 스프링 보안 방법 섹션에서 확인할 수 있습니다.@WebMvcTestWebSecurityConfigurerMockMvc

  때로는 스프링 MVC 테스트를 작성하는 것만으로는 충분하지 않습니다. 스프링 부트을 사용하면 실제 서버에서 전체 종단간 테스트를 실행하는 데 도움이 될 수 있습니다.
자동 구성 스프링 웹플럭스 테스트

Spring WebFlux 컨트롤러가 예상대로 작동하는지 테스트하려면 어플을 사용할 수 있습니다. 스프링 웹플럭스 인프라를 자동 구성하고 스캔한 콩을 , , , , 및 로 제한합니다. 주석을 사용할 때 일반 콩은 스캔되지 않습니다.@WebFluxTest@WebFluxTest@Controller@ControllerAdvice@JsonComponentConverterGenericConverterWebFilterWebFluxConfigurer@Component@WebFluxTest

  활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @WebFluxTest
  Jackson과 같은 추가 구성 요소를 등록해야 하는 경우 테스트에서 추가 구성 클래스를 가져올 수 있습니다. Module@Import

종종 단일 컨트롤러로 제한되며 필요한 공동 작업자에 대한 모의 구현을 제공하기 위해 부기와 함께 사용됩니다.@WebFluxTest@MockBean

@WebFluxTest 또한 웹테스트클라이언트를자동으로 구성하여 전체 HTTP 서버를 시작하지 않고도 웹플렉스 컨트롤러를 신속하게 테스트할 수 있는 강력한 방법을 제공합니다.

  또한 비-(예:)로 자동 구성할 수 있습니다. 다음 예제에서는 둘 다를 사용하는 클래스와 다음을 보여 주며. WebTestClient@WebFluxTest@SpringBootTest@AutoConfigureWebTestClient@WebFluxTestWebTestClient
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 기능 웹 프레임워크를 통해 등록된 경로를 검색할 수 없습니다. 컨텍스트에서 콩을 테스트하려면 를 통해 또는 사용 하 여 자신을 가져오는 것이 좋습니다. RouterFunctionRouterFunction@Import@SpringBootTest
  @WebFluxTest 형식의 사용자 지정 보안 구성을 검색할 수 없습니다. 테스트에 포함하려면 bean을 통해 등록하거나 사용하는 구성을 가져와야 합니다. @BeanSecurityWebFilterChain@Import@SpringBootTest
  때로는 스프링 웹 플럭스 테스트를 작성하는 것만으로는 충분하지 않습니다. 스프링 부트을 사용하면 실제 서버에서 전체 종단간 테스트를 실행하는 데 도움이 될 수 있습니다.
자동 구성 데이터 JPA 테스트

이 애니프런서를 사용하여 JPA 응용 프로그램을 테스트할 수 있습니다. 기본적으로 클래스를 검사하고 스프링 데이터 JPA 리포지토리를 구성합니다. 클래스경로에서 임베디드 데이터베이스를 사용할 수 있는 경우 데이터베이스도 구성합니다. 일반 콩은 에로드되지 않습니다.@DataJpaTest@Entity@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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도 사용할 수 있습니다. 다음 예제에서는 사용 중의 부가가 표시됩니다.EntityManagerTestEntityManager@DataJpaTest@AutoConfigureTestEntityManagerJdbcTemplate@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만 필요로 하고 사용하지 않는 테스트용과 유사합니다. 기본적으로 메모리 내 임베디드 데이터베이스와 .를 구성합니다. 일반 콩은 에로드되지 않습니다.@DataJpaTestDataSourceJdbcTemplate@ComponentApplicationContext

  활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @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 테스트"를참조하십시오.@AutoConfigureTestDatabaseDataJpaTest

자동 구성 데이터 JDBC 테스트

@DataJdbcTest 스프링 데이터 JDBC 리포지토리를 사용하는 테스트와 유사하지만 입니다. 기본적으로 메모리 내 임베디드 데이터베이스, 스프링 데이터 JDBC 리포지토리를 구성합니다. 일반 콩은 에로드되지 않습니다.@JdbcTestJdbcTemplate@ComponentApplicationContext

  활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @DataJdbcTest

기본적으로 데이터 JDBC 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다. 자세한 내용은 스프링 프레임워크 참조 설명서의 관련 섹션을 참조하십시오. 그렇지 않은 경우 JDBC 예제와 같이테스트 또는 전체 테스트 클래스의 트랜잭션 관리를 비활성화할 수 있습니다.

실제 데이터베이스에 대해 테스트를 실행하려는 경우. ("자동 구성된 데이터 JPA 테스트"를참조하십시오.@AutoConfigureTestDatabaseDataJpaTest

자동 구성 jOOQ 테스트

jOOQ 관련 테스트와 유사한 방식으로 사용할 수 있습니다. jOOQ가 데이터베이스 스키마에 해당하는 Java 기반 스키마에 크게 의존하므로 기존 스키마가 사용됩니다. 메모리 내 데이터베이스로 바꾸려면 해당 설정을 재정의하는 데 사용할 수 있습니다. (스프링 부트과 jOOQ를 사용하는 것에 대한 자세한 내용은"jOOQ 사용",이 장 의 초기 참조). 일반 콩은 에로드되지 않습니다.@JooqTest@JdbcTestDataSource@AutoConfigureTestDatabase@ComponentApplicationContext

  활성화된 자동 구성 목록은 부록에서 찾을수 있습니다. @JooqTest

@JooqTest 를 구성합니다. 일반 콩은 에로드되지 않습니다. 다음 예제에서는 사용 중의 부가가 표시됩니다.DSLContext@ComponentApplicationContext@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"를참조하십시오.)@DataMongoTestMongoTemplate@Document@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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"를참조하십시오.)@DataLdapTestLdapTemplate@Entry@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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 지원을 자동으로 구성하고 구성하고 에 대한 지원을 추가합니다. 일반 콩은 에로드되지 않습니다.@RestClientTestRestTemplateBuilderMockRestServiceServer@ComponentApplicationContext

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @RestClientTest

테스트하려는 특정 원두는 다음 예제와 같이 의 또는 특성을 사용하여 지정해야 합니다.valuecomponents@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-snippetsbuild/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 문서 구성을 보다 더 많이 제어해야 하는 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocsRestDocsMockMvcConfigurationCustomizer

@TestConfiguration
static class CustomizationConfiguration
        implements RestDocsMockMvcConfigurationCustomizer {

    @Override
    public void customize(MockMvcRestDocumentationConfigurer configurer) {
        configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
    }

}

매개 변수 출력 디렉토리에 대한 스프링 REST 문서 지원을 사용하려면 콩을 만들 수 있습니다. 자동 구성은 이 결과 처리기로 호출하므로 각 호출에서 기본 스니펫이 자동으로 생성됩니다. 다음 예제에서는 정의되는 예제를 보여 주겠습니다.RestDocumentationResultHandleralwaysDoMockMvcRestDocumentationResultHandler

@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 문서 구성을 보다 더 많이 제어해야 하는 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocsRestDocsWebTestClientConfigurationCustomizer

@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 문서 구성에 대한 더 많은 제어가 필요한 경우 다음 예제와 같이 콩을 사용할 수 있습니다.@AutoConfigureRestDocsRestDocsRestAssuredConfigurationCustomizer

@TestConfiguration(proxyBeanMethods = false)
public static class CustomizationConfiguration implements RestDocsRestAssuredConfigurationCustomizer {

    @Override
    public void customize(RestAssuredRestDocumentationConfigurer configurer) {
        configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
    }

}
자동 구성 스프링 웹 서비스 테스트

Spring Web Services 프로젝트를 사용하여 콜 웹 서비스를 사용하는 응용 프로그램을 테스트하는 데 사용할 수 있습니다. 기본적으로 모의 콩을 구성하고 자동으로 사용자 정의할 수 있습니다. 스프링 부트과 함께 웹 서비스를 사용하는 자세한 내용은"웹 서비스"를참조하세요.@WebServiceClientTestWebServiceServerWebServiceTemplateBuilder

  활성화된 자동 구성 설정 목록은 부록에서 찾을수 있습니다. @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

@SpringBootApplication
@EnableBatchProcessing
public class SampleApplication { ... }

이 클래스는 테스트의 소스 구성이므로 모든 슬라이스 테스트는 실제로 스프링 배치를 시작하려고 시도하므로 원하는 것이 아닙니다. 권장되는 방법은 다음 예제와 같이 해당 영역별 구성을 응용 프로그램과 동일한 수준에서 별도의 클래스로 이동하는 것입니다.@Configuration

@Configuration(proxyBeanMethods = false)
@EnableBatchProcessing
public class BatchConfiguration { ... }
  응용 프로그램의 복잡성에 따라 사용자 지정에 대한 단일 클래스 또는 도메인 영역당 클래스가 하나있을 수 있습니다. 후자의 방법을 사용하면 필요한 경우 추가 기능을 사용하여 테스트 중 하나에서 사용할 수 있습니다. @Configuration@Import

테스트 조각은 클래스를 스캔에서 제외합니다. 예를 들어, 다음 구성에는 테스트 슬라이스에 의해 로드된 응용 프로그램 컨텍스트에 지정된 콩이 포함되지 않습니다.@Configuration@WebMvcTestWebMvcConfigurer

@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-springspock-spring

4.26.4. 테스트 유틸리티

응용 프로그램을 테스트할 때 일반적으로 유용한 몇 가지 테스트 유틸리티 클래스는 의 일부로 패키지됩니다.spring-boot

컨피파일응용컨텍스트이더라이저

ConfigFileApplicationContextInitializer 스프링 부트 파일을 로드하기 위해 테스트에 적용할 수 있는 것입니다. 다음 예제와 같이 제공되는 전체 기능 집합이 필요하지 않을 때 사용할 수 있습니다.ApplicationContextInitializerapplication.properties@SpringBootTest

@ContextConfiguration(classes = Config.class,
    initializers = ConfigFileApplicationContextInitializer.class)
  단독으로 사용하면 주입에 대한 지원이 제공되지 않습니다. 유일한 임무는 파일이 스프링에 로드되도록하는 것입니다. 지원을 위해 추가로 구성하거나 사용하는 것이 필요하며, 이 중 하나를 자동으로 구성해야 합니다. ConfigFileApplicationContextInitializer@Value("${…​}")application.propertiesEnvironment@ValuePropertySourcesPlaceholderConfigurer@SpringBootTest
테스트속성값

TestPropertyValues 또는 에 속성을 빠르게 추가할 수 있습니다. 다음과 같이 문자열로 호출할 수 있습니다.ConfigurableEnvironmentConfigurableApplicationContextkey=value

TestPropertyValues.of("org=Spring", "name=Boot").applyTo(env);
출력 캡처

OutputCapture 캡처 및 출력에 사용할 수 있는 JUnit입니다. 다음과 같이 테스트 클래스 생성자 또는 테스트 메서드에 인수로 추가 및 삽입을 사용하려면 다음을 따르세요.ExtensionSystem.outSystem.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를 제공합니다, 와달리. WebTestClientTestRestTemplate

아파치 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은 다음 예제와 같이 포함된 서버에 자동으로 연결됩니다.@SpringBootTestWebEnvironment.RANDOM_PORTWebEnvironment.DEFINED_PORTTestRestTemplateRestTemplateBuilder

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

Phillip 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 Frederick

2.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

반응형