뭐 가 달라 요?Spring Boot 를 살 펴 보 겠 습 니 다. JUnit 5 기반 유닛 테스트 를 실현 합 니 다.

작은 허브 읽 기:
프로젝트 개발 과 디 버 깅 을 하 는 과정 에서 유닛 테스트 가 필요 할 때 가 있 습 니 다. 최신 Junit 5 는 어떻게 테스트 하 는 지 아 세 요?
작자
https://www.jianshu.com/p/4648fd55830e
목차
  • 안내
  • JUnit 4 와 JUnit 5 의 차이
  • 테스트 용례 실행 무시
  • 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

  • 개발 환경
  • JDK 8

  • 예시
  • Spring Boot 프로젝트 를 만 듭 니 다. 참고: IntelliJ IDEA 에서 Spring Boot 프로젝트 를 만 듭 니 다.
  • 추가  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  주 해 된 주 설정 클래스 를 사용 하고 스프링 프로그램 상하 문 을 시작 합 니 다.
  • 테스트 대기 응용 논리 코드 보충
  • 4.1 서비스 계층 인터페이스 정의
    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;
        }
    }
    
  • HTTP 요청 을 보 내 는 유닛 테스트 를 작성 합 니 다.
  • 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)
  • Controller 층 만 예화 되 었 기 때문에 의존 하 는 Service 층 인 스 턴 스 를 통과 해 야 합 니 다.  @MockBean  창설, 통과  Mockito  의 방법 은 Mock 에서 나 온 Service 층 의 인 스 턴 스 가 특정한 상황 에서 호출 되 었 을 때의 결 과 를 되 돌려 줍 니 다.

  • (끝)
    MarkerHub 문장 인덱스: (원문 읽 기 직통 클릭)
    https://github.com/MarkerHub/JavaIndex
    【    】
       Spring boot  Vue          
      :SpringBoot             
    
                ?JWT ?
    Spring  IOC     --         
          Java   
    
    
    

    좋 은 글!시 켜 보고 있어!

    좋은 웹페이지 즐겨찾기