ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 메소드


    1. assertTrue(a): a가 True인가
    2. assertFalse(a): a가 False인가
    3. assertEquals(a, b): a와 b의 값이 동일한가
    4. assertSame(a, b): a와 b의 객체가 동일한가
    5. assertNull(a): a가 null인가
    6. assertNotNull(a): a가 null이 아닌가
    7. 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

     

    댓글

Designed by Tistory.