Server/Spring Boot

[Springboot] 단위 테스트 코드 작성해보기 (Service, Dao, Repository)

hoonylab 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
반응형