뭐 가 달라 요?Spring Boot 를 살 펴 보 겠 습 니 다. JUnit 5 기반 유닛 테스트 를 실현 합 니 다.
프로젝트 개발 과 디 버 깅 을 하 는 과정 에서 유닛 테스트 가 필요 할 때 가 있 습 니 다. 최신 Junit 5 는 어떻게 테스트 하 는 지 아 세 요?
작자
https://www.jianshu.com/p/4648fd55830e
목차
RunWith
설정 @Before
、 @BeforeClass
、 @After
、 @AfterClass
교체 됨 본 고 는 Spring Boot 2 가 JUnit 5 를 바탕 으로 하 는 단원 테스트 실현 방안 을 소개 한다.
Spring Boot 2.2.0 버 전이 유닛 테스트 기본 라 이브 러 리 로 JUnit 5 를 도입 하기 시 작 했 습 니 다. Spring Boot 2.2.0 버 전에
spring-boot-starter-test
JUnit 4 의 의존 도 를 담 았 고, Spring Boot 2.2.0 버 전 이후 Junit Jupiter 로 교체 됐다.유닛 4 와 유닛 5 의 차이.
1. 테스트 용례 실행 무시
JUnit 4:
@Test
@Ignore
public void testMethod() {
}
JUnit 5:
@Test
@Disabled("explanation")
public void testMethod() {
}
2.
RunWith
배치 하 다.JUnit 4:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Test
public void contextLoads() {
}
}
JUnit 5:
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class ApplicationTests {
@Test
public void contextLoads() {
}
}
3.
@Before
、 @BeforeClass
、 @After
、 @AfterClass
교체 되다@BeforeEach
바꾸다 @Before
@BeforeAll
바꾸다 @BeforeClass
@AfterEach
바꾸다 @After
@AfterAll
바꾸다 @AfterClass
개발 환경
예시
spring-boot-starter-web
결국 pom.xml
아래 와 같다.
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.6.RELEASE
tutorial.spring.boot
spring-boot-junit5
0.0.1-SNAPSHOT
spring-boot-junit5
Demo project for Spring Boot Unit Test with JUnit 5
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
package tutorial.spring.boot.junit5;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBootJunit5ApplicationTests {
@Test
void contextLoads() {
}
}
이 테스트 클래스 의 역할 은 응용 프로그램의 상하 문 이 정상적으로 시 작 될 수 있 는 지 검사 하 는 것 이다.
@SpringBootTest
설명 봄 부 트 찾기 테이프 알려 주기 @SpringBootApplication
주 해 된 주 설정 클래스 를 사용 하고 스프링 프로그램 상하 문 을 시작 합 니 다.package tutorial.spring.boot.junit5.service;
public interface HelloService {
String hello(String name);
}
4.2. 정의 컨트롤 러 층
package tutorial.spring.boot.junit5.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import tutorial.spring.boot.junit5.service.HelloService;
@RestController
public class HelloController {
private final HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") String name) {
return helloService.hello(name);
}
}
4.3 서비스 계층 의 실현 을 정의 한다.
package tutorial.spring.boot.junit5.service.impl;
import org.springframework.stereotype.Service;
import tutorial.spring.boot.junit5.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "Hello, " + name;
}
}
package tutorial.spring.boot.junit5;
import org.assertj.core.api.Assertions;
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.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testHello() {
String requestResult = this.restTemplate.getForObject("http://127.0.0.1:" + port + "/hello/spring",
String.class);
Assertions.assertThat(requestResult).contains("Hello, spring");
}
}
설명:
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
로 컬 랜 덤 포트 로 서 비 스 를 시작 합 니 다.@LocalServerPort
... 에 해당 하 다 @Value("${local.server.port}")
; webEnvironment
후, Spring Boot 는 자동 으로 하 나 를 제공 합 니 다. TestRestTemplate
예 를 들 어 HTTP 요청 을 보 내 는 데 사용 할 수 있 습 니 다.TestRestTemplate
인 스 턴 스 HTTP 요청 외 에 도 빌 릴 수 있 습 니 다. org.springframework.test.web.servlet.MockMvc
유사 한 기능 을 완 성 했 습 니 다. 코드 는 다음 과 같 습 니 다. package tutorial.spring.boot.junit5.controller;
import org.assertj.core.api.Assertions;
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 org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private HelloController helloController;
@Autowired
private MockMvc mockMvc;
@Test
public void testNotNull() {
Assertions.assertThat(helloController).isNotNull();
}
@Test
public void testHello() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders.get("/hello/spring"))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("Hello, spring"));
}
}
상기 테스트 방법 은 전체 테스트 에 속 하고 상하 문 을 모두 시작 할 것 이 며, 예 를 들 어 컨트롤 러 층 만 테스트 하 는 등 층 별 테스트 방법 도 있다.
package tutorial.spring.boot.junit5.controller;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import tutorial.spring.boot.junit5.service.HelloService;
@WebMvcTest
public class HelloControllerTest {
@Autowired
private HelloController helloController;
@Autowired
private MockMvc mockMvc;
@MockBean
private HelloService helloService;
@Test
public void testNotNull() {
Assertions.assertThat(helloController).isNotNull();
}
@Test
public void testHello() throws Exception {
Mockito.when(helloService.hello(Mockito.anyString())).thenReturn("Mock hello");
this.mockMvc.perform(MockMvcRequestBuilders.get("/hello/spring"))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("Mock hello"));
}
}
설명:
@WebMvcTest
설명 은 Spring Boot 에 게 전체 컨 텍스트 를 예화 하지 않 고 컨트롤 러 층 만 예화 하 는 인 스 턴 스 를 지정 할 수 있 음 을 알려 줍 니 다. @WebMvcTest(HelloController.class)
@MockBean
창설, 통과 Mockito
의 방법 은 Mock 에서 나 온 Service 층 의 인 스 턴 스 가 특정한 상황 에서 호출 되 었 을 때의 결 과 를 되 돌려 줍 니 다.(끝)
MarkerHub 문장 인덱스: (원문 읽 기 직통 클릭)
https://github.com/MarkerHub/JavaIndex
【 】
Spring boot Vue
:SpringBoot
?JWT ?
Spring IOC --
Java
좋 은 글!시 켜 보고 있어!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.