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