본문 바로가기
Spring/이론

Test

by 모스키토끼 2020. 6. 3.

의존성 추가

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>

테스트 클래스 설명

  • @SpringBootTest
    • @RunWith(SpringRunner.class)와 함께 사용
    • 빈 설정 파일을 알아서 찾아서 사용
      (SPringBootApplication을 찾아가 모든 빈을 스캔 -> Test용 application Context를 만들면서 모든 빈들을 등록
    • webEnvironment
      1. MOCK:
        - 서블릿 컨테이너를 띄우지 않음(내장 톰캣 구동 X)
        - 서블릿을 MockUp 하여 사용
        - MockMvc 사용(@AutoConfigureMockMvc 추가) -> MockUp 된 서블릿과 interaction
      2. RANDOM_PORT, DEFINED_PORT
        - 실제로 서블릿을 띄움(내장 톰캣 구동)
        - TestRestTemplate or TestWebClient를 사용해야 함
        - @MockBean을 사용하여 테스트 범위를 줄일 수 있음
      3. NONE:
        - 서브릿 환경 제공 안 함
  • 슬라이스 테스트
    • @SpringBootTest는 모든 빈을 스캔하여 진행하는 통합 테스트 -> 무겁다. -> 테스트할 빈들만 등록 필요
    • 종류
      1. @JsonTest
        - Json 형태 테스트
      2. @WebMvcTest
        - ex)
        Controller 빈 하나만 테스트 -> 웹 객체 밑에 있는 의존성이 끊김 -> MockBean으로 의존성 추가 필요
      3. ...

테스트 코드

Mock 환경 테스트

// WebEnvironment가 mock 환경일 때 테스트 하는 방법
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {

	@Autowired
	MockMvc mockMvc;

	@Test
	public void hello() throws Exception {
		mockMvc.perform(get("/hello"))
			.andExpect(status().isOk())
			.andExpect(content().string("hello bigring"))
			.andDo(print());

	}
}

@RestController
public class SampleController {
	
	@Autowired
	private SampleService sampleService;

	@GetMapping("/hello")
	public String hello(){
		return "hello "+ sampleService.getName();
	}
}

@Service
public class SampleService {
	public String getName() {
		return "bigring";
	}
}



실제 서블릿 컨테이너 환경(TestRestTemplate 사용)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {

	@Autowired
	TestRestTemplate testRestTemplate;

	//서비스 단계까지 테스트 하고 싶지 않을 때, 컨트롤러만 테스트 하고 싶을 때
	@MockBean
	SampleService mockSampleService;

	@Test
	public void hello() throws Exception {
    	//MockBean으로 Service를 만들었으므로 Mocking할 수 있음
    	when(mockSampleService.getName()).thenReturn("bigring");

		String result = testRestTemplate.getForObject("/hello",String.class);
		assertThat(result).isEqualTo("hello bigring");

	}

}

실제 서블릿 컨테이너 환경(WebTestClient사용)

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebMvcTest(SampleController.class)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {

	@Autowired
	WebTestClient webTestClient;

	@Autowired
	MockMvc mockMvc;

	@Test
	public void hello() throws Exception {
		when(mockSampleService.getName()).thenReturn("bigring");

		webTestClient.get().uri("/hello").exchange()
        	.expectStatus().isOk()
			.expectBody(String.class).isEqualTo("hello bigring");
	}

}

 

WebTestClient은 비동기, 기존에 RestClient는 동기적

  • 요청을 보내고 응답이 오면 콜백이 옴  
  • 그때 콜백을 실행 
  • 웹 클라이언트와 비슷한 API로 테스트 가능

슬라이스 테스트(@WebMvcTest 사용)

@WebMvcTest(SampleController.class)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {

	@MockBean
	SampleService mockSampleService;

	@Autowired
	MockMvc mockMvc;

	@Test
	public void hello() throws Exception {
    
		when(mockSampleService.getName()).thenReturn("bigring");

		mockMvc.perform(get("/hello"))
			.andExpect(content().string("hello bigring"));

	}

}

Reference

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급이상 프레임워크 및 라이브러리 Spring Boot Spring Back-End 온라인 강의 스프

www.inflearn.com

 

'Spring > 이론' 카테고리의 다른 글

HtmlUnit  (0) 2020.06.03
JPQL  (0) 2020.05.17
SpringBoot  (0) 2020.04.22
Restful Web Service with Spring  (0) 2020.04.20
Restful Web Service  (0) 2020.04.19

댓글