최근 스프링 부트는 테스트 유닛으로 JUnit4에서 JUnit5(jupiter)로 변경되었다. 토비의 스프링을 스프링 부트 버전으로 연습하다가 기존에 사용했던 JUnit4 방식의 Exception 테스트가 안돼 찾아보고 정리를 해 보았다.
User를 가져오는 get() 메서드
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = dataSource.getConnection();
PreparedStatement ps = c.prepareStatement("select * from users where id = ?");
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
User user = null;
if(rs.next()) {
user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
}
rs.close();
ps.close();
c.close();
if(user == null)
throw new EmptyResultDataAccessException(1);
return user;
}
위 메서드에서 user를 가져오지 못한다면 EmptyResultDataAccessException을 던지도록 하고 이것을 테스트 해보고 싶었다.
JUnit4에서의 방식
@Test(expected = "EmptyResultDataAccessException.clss)
public void getUserFailure() throws SQLException, ClassNotFoundException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDAO dao = context.getBean("userDAO", UserDAO.class);
dao.deleteAll();
assertThat(dao.getCount()).isEqualTo(0);
dao.get("unkown_id");
}
위처럼 @Test에 expected로 해당 예외를 담아주면 알아서 자동으로 예외 테스트를 할 수 있었다.
그래서 JUnit5도 같겟지 하면서 @Test에 expected를 주니 빨간줄이 난무하기 시작한다. JUnit5에선 기존 방법으로 테스트를 못하고 다음과 같이 테스트를 하면 된다.
@Test
public void getUserFailure() throws SQLException, ClassNotFoundException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDAO dao = context.getBean("userDAO", UserDAO.class);
dao.deleteAll();
assertThat(dao.getCount()).isEqualTo(0);
assertThrows(EmptyResultDataAccessException.class, () -> {
dao.get("unkown_id");
});
}
assertThrows에 필요한 클래스를 등록하고 람다식으로 예외를 던질 실행문을 작성하면 된다.