출처: https://blog.iroot.kr/341 [RootKR] 출처: https://blog.iroot.kr/341 [RootKR]

 최근 스프링 부트는 테스트 유닛으로 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에 필요한 클래스를 등록하고 람다식으로 예외를 던질 실행문을 작성하면 된다. 

+ Recent posts