ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Springboot] 단위 테스트 코드 작성해보기 (Service, Dao, Repository)
    Server/Spring Boot 2025. 4. 21. 15:45
    728x90
    반응형

    Spring Boot에서 JUnit 5로 Service, Repository, DAO 단위 테스트하기

    1. 엔티티 클래스 (User.java)

    
    @Entity
    public class User {
        @Id @GeneratedValue
        private Long id;
        private String name;
        private String email;
    
        // getters, setters, constructors
    }
    

    2. Repository 인터페이스 (UserRepository.java)

    
    public interface UserRepository extends JpaRepository<User, Long> {
        Optional<User> findByEmail(String email);
    }
    

    3. DAO 클래스 (UserDao.java)

    
    @Repository
    public class UserDao {
    
        private final JdbcTemplate jdbcTemplate;
    
        public UserDao(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        public int countUsers() {
            return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
        }
    }
    

    4. Service 클래스 (UserService.java)

    
    @Service
    public class UserService {
    
        private final UserRepository userRepository;
        private final UserDao userDao;
    
        public UserService(UserRepository userRepository, UserDao userDao) {
            this.userRepository = userRepository;
            this.userDao = userDao;
        }
    
        public User createUser(String name, String email) {
            User user = new User(null, name, email);
            return userRepository.save(user);
        }
    
        public Optional<User> getUserByEmail(String email) {
            return userRepository.findByEmail(email);
        }
    
        public long countUsers() {
            return userDao.countUsers();
        }
    
        public void deleteUser(Long id) {
            userRepository.deleteById(id);
        }
    }
    

    5. Repository 단위 테스트 (UserRepositoryTest.java)

    
    @DataJpaTest
    class UserRepositoryTest {
    
        @Autowired
        private TestEntityManager entityManager;
    
        @Autowired
        private UserRepository userRepository;
    
        @Test
        void testFindByEmail() {
            User user = new User(null, "Alice", "alice@example.com");
            entityManager.persist(user);
            Optional<User> found = userRepository.findByEmail("alice@example.com");
            assertTrue(found.isPresent());
            assertEquals("Alice", found.get().getName());
        }
    }
    

    6. DAO 단위 테스트 (UserDaoTest.java)

    
    @JdbcTest
    class UserDaoTest {
    
        @Autowired
        private UserDao userDao;
    
        @Test
        void testCountUsers() {
            int count = userDao.countUsers();
            assertTrue(count >= 0);
        }
    }
    

    7. Service 단위 테스트 (UserServiceTest.java)

    
    @ExtendWith(MockitoExtension.class)
    class UserServiceTest {
    
        @Mock
        private UserRepository userRepository;
    
        @Mock
        private UserDao userDao;
    
        @InjectMocks
        private UserService userService;
    
        @Test
        void testCreateUser() {
            User user = new User(null, "Bob", "bob@example.com");
            when(userRepository.save(any(User.class))).thenReturn(user);
    
            User saved = userService.createUser("Bob", "bob@example.com");
            assertEquals("Bob", saved.getName());
        }
    
        @Test
        void testCountUsers() {
            when(userDao.countUsers()).thenReturn(10);
            long count = userService.countUsers();
            assertEquals(10, count);
        }
    }
    

    마무리

    이처럼 JUnit 5와 Spring Boot의 테스트 지원 기능을 잘 활용하면 Service, Repository, DAO 계층의 로직을 각각 분리하여 테스트할 수 있습니다. 테스트 자동화를 통해 개발 효율성과 코드 품질을 함께 높여보세요!

    728x90
    반응형

    댓글

Designed by Tistory.