th42500의 TIL

[Spring, JUnit] JUnit5를 적용한 UserDao Test 코드 작성 본문

Backend/Spring & SpringBoot

[Spring, JUnit] JUnit5를 적용한 UserDao Test 코드 작성

th42500 2022. 10. 18. 22:11

오늘은 그동안 작성했던 UserDao에 작성한 메서드들을 테스트 코드를 통해 잘 작동하는지 테스트해보려 한다.

 

❓ 테스트 코드를 작성해야 하는 이유

✔ 개발 과정에서 문제를 조기에 발견할 수 있음

✔ 리팩토링의 리스크가 감소함

✔ 애플리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있음

✔ 명세 문서로서의 기능을 수행할 수 있음

✔ 코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지할 수 있음

 

 

❓ JUnit이란?

✔ 자바 언어에서 사용되는 대표적인 테스트 플레임워크로서, 단위 테스트를 위한 도구를 제공

 

 

📌 JUnit5를 적용한 UserDao Test 코드 작성

[ UserDao.java ]

package com.sping.dao;

import com.sping.domain.User;

import java.sql.*;
import java.util.List;

public class UserDao {

    private AWSConnectionMaker awsConnectionMaker;
    private ConnectionMaker connectionMaker;

    public UserDao() {
        this.connectionMaker = new AWSConnectionMaker();
    }

    public List<User> selectAll() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<User> userList = null;

        try {
            conn = connectionMaker.getConnection();
            pstmt = conn.prepareStatement("select * from users");
            rs = pstmt.executeQuery();

            while(rs.next()) {
                User user = new User(rs.getString("id"), rs.getString("name"), rs.getString("password"));
                userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            ConnectionClose.close(conn, pstmt, rs);
        }

        return userList;
    }

    public User selectById(String sId) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try{
            conn = connectionMaker.getConnection();
            pstmt = conn.prepareStatement("select id, name, password from users where id = ?");
            pstmt.setString(1, sId);
            rs = pstmt.executeQuery();
            if(rs.next()) {
                user = new User(rs.getString("id"), rs.getString("name"), rs.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            ConnectionClose.close(conn, pstmt, rs);
        }
        return user;
    }

    public void add(User user) {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = connectionMaker.getConnection();
            pstmt = conn.prepareStatement("insert into users(id, name, password) values (?, ?, ?)");
            pstmt.setString(1, user.getId());
            pstmt.setString(2, user.getName());
            pstmt.setString(3, user.getPassword());

            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            ConnectionClose.close(conn, pstmt);
        }
    }

    public void deleteAll() {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = connectionMaker.getConnection();
            pstmt = conn.prepareStatement("delete from users");
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            ConnectionClose.close(conn, pstmt);
        }
    }

    public int getCount() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int cnt = 0;

        try{
            conn = connectionMaker.getConnection();
            pstmt = conn.prepareStatement("select count(*) from users");

            rs = pstmt.executeQuery();

            if (rs.next()) {
                cnt = rs.getInt(1);
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            ConnectionClose.close(conn, pstmt);
        }

        return cnt;
    }
}

[UserDaoTest.java]

package com.sping.dao;

import com.sping.domain.User;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class UserDaoTest {
    UserDao userDao;

    @BeforeEach
    void setUp() {
        userDao = new UserDao();
        userDao.deleteAll();
    }

    @Test
    @DisplayName("add기능 & select 테스트")
    void addAndSelectById() {
        User user = new User("0", "Soyeong", "1234");
        userDao.add(user);

        assertEquals("Soyeong", userDao.selectById("0").getName());
    }


    @Test
    @DisplayName("데이터 개수 세기 테스트")
    void getCount() {
        assertEquals(0, userDao.getCount());
        User user = new User("0", "Soyeong", "1234");
        userDao.add(user);

        assertEquals(1, userDao.getCount());
    }

    @Test
    @DisplayName("deletAll 테스트")
    void deleteAll() {
        userDao.deleteAll();
        assertEquals(0, userDao.getCount());
    }

}

UserDaoTest에 사용된 Annotation

- @Test :  테스트 코드를 포함한 메서드를 정의

- @BeforAll : 테스트를 시작하기 전에 호출되는 메서드를 정의

- @BeforeEach : 각 테스트 메서드가 실행되기 전에 동작하는 메서드를 정의

- @AfterAll : 테스트를 종료하면서 호출되는 메서드를 정의

- @AfterEach : 각 테스트 메서드가 종료되면서 호출되는 메서드를 정의

 

 

[ 테스트 결과 ]

테스트 결과 모든 테스트가 잘 통과하는 것을 확인할 수 있었다.

Comments