-
[Spring boot] JUnit에 대해 알아보자spring boot 2024. 2. 17. 22:16
JUnit이란?
- Java의 대표적인 Test Framework
- 어노테이션 기반 테스트 지원
- Assert를 사용하여 기대값에 대해 수행 결과를 확인할 수 있음
F.I.R.S.T 원칙
Fast: 테스트 코드는 빠르게 실행되어야 한다.
Independent: 독립적으로 실행이 될 수 있어야 한다.
Repeatable: 매번 같은 결과가 나와야 한다.
Self-Validating: 그 자체로 실행하여 결과를 확인 할 수 있어야 한다.
Timely: 코드 완성되기 전부터 테스트가 가능해야 한다.
package com.example.demo.test; import org.junit.jupiter.api.*; public class TestLifeCycle { @BeforeAll static void beforeAll() { System.out.println("BeforeAll"); System.out.println(); } @BeforeEach void beforeEach() { System.out.println("BeforeEach"); System.out.println(); } @AfterAll static void afterAll() { System.out.println("AfterAll"); System.out.println(); } @AfterEach void afterEach() { System.out.println("AfterEach"); System.out.println(); } @Test void test1() { System.out.println("Test 1"); System.out.println(); } @Test void test2() { System.out.println("Test 2"); System.out.println(); } } // BeforeAll // BeforeEach // Test 1 // AfterEach // BeforeEach // Test 2 // AfterEach // AfterAll
- @BeforeAll - 테스트 시작 전 실행 되도록 하는 어노테이션
- @BeforeEach - 각 테스트 메소드가 시작되기 전에 실행되도록 하는 어노테이션
- @AfterAll - 테스트가 완료된 후 실행 되도록 하는 어노테이션
- @AfterEach - 각 테스트 메소드가 실행 된 후 실행 되도록 하는 어노테이션
- @Test - 테스트용 메소드를 표현하는 어노테이션
Test Code
package com.example.demo.controller; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import com.google.gson.Gson; import com.example.demo.data.dao.UserDao; import com.example.demo.data.dto.UserDto; 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.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(Controller.class) class ControllerTest { @Autowired private MockMvc mockMvc; @MockBean UserDao userDao; @Test void getUser() throws Exception { Mockito.when(userDao.getUser(1)).thenReturn( new UserDto(1, "홍길동", 30, "a@gmail.com") ); mockMvc.perform( get("/get-user").param("userId", "1") ).andExpect(status().isOk()) .andExpect(jsonPath("$.userId").exists()) .andExpect(jsonPath("$.name").exists()) .andExpect(jsonPath("$.age").exists()) .andExpect(jsonPath("$.email").exists()) .andDo(print()); Mockito.verify(userDao).getUser(1); } @Test void saveUser() throws Exception { UserDto user = UserDto.builder().name("Kevin").age(10).email("kevin@gmail.com").build(); Mockito.when(userDao.saveUser(user)).thenReturn(true); Gson gson = new Gson(); String json = gson.toJson(user); mockMvc.perform(post("/save-user").content(json).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); Mockito.verify(userDao).saveUser(user); } }
- @WebMvcTest() - controller관련 코드를 테스트 할때 사용 //
- @MockBean - 테스트할 클래스에서 주입 받고 있는 객체에 대해 가짜 객체를 생성해주는 어노테이션
- Mockito.when() - Mock 객체가 특정 상황에서 해야할 행동 정의 // 예: userDao.getUser(1)가 실행되면 db에서 데이터를 불러올 필요없이 new UserDto(1, "홍길동", 30, "a@gmail.com") 리턴
- Mockito.verify() - 해당 객체의 메소드가 실행됐는지 확인
Assert 메소드
- assertTrue(a): a가 True인가
- assertFalse(a): a가 False인가
- assertEquals(a, b): a와 b의 값이 동일한가
- assertSame(a, b): a와 b의 객체가 동일한가
- assertNull(a): a가 null인가
- assertNotNull(a): a가 null이 아닌가
- assertThrows(a, b): b가 실행됐을때 에러 a가 발생하는가
출처
https://www.youtube.com/watch?v=SFVWo0Z5Ppo&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlzU&index=21
https://thalals.tistory.com/273
[Spring boot] 테스트 코드 작성 (1) - Junit을 이용한 Unit Test(단위 테스트) / Assert 메소드
Spring 테스트 코드 작성해보기! 목차 Junit 이란 Junit 사용설정 Junit 어노테이션 Junit 사용법 Assert 메소드 @Nest사용 엣지 케이스 확인 Junit을 이용한 단위테스트 1) 단위 테스트란 프로그램을 작은 단
thalals.tistory.com
'spring boot' 카테고리의 다른 글
JPA 기본키 생성 전략 @GeneratedValue (0) 2024.03.25 [Spring boot] JPA 정렬과 페이징 (0) 2024.02.24 [Spring boot] RestTemplate에 대해 알아보자 (0) 2024.02.17 [Spring boot] JPA 적용하기, MySQL (0) 2024.02.14 [Spring boot] Lombok에 대해 알아보자 (1) 2024.02.12