해결된 질문
작성
·
313
·
수정됨
0
@Test
void test(){
Controller controller = new Controller();
Assertions.assertThatThrownBy(()->controller.controller())
.isInstanceOf(RuntimeSQLException.class);
}
*****************
static class Service{
Repository repository = new Repository();
NetworkClient networkClient = new NetworkClient();
public void service() {
repository.call();
networkClient.call();
}
}
지금 서비스 로직에서 메서드 두개를 호출했는데
하나는 RuntimeConnectionException이 throw되고 다른 하나는 RuntimeSQLException이 throw가 되는데 테스트 코드가 성공할 수 있나요??
답변 2
1
안녕하세요. jung님, 공식 서포터즈 y2gcoder입니다.
보시면 테스트 코드는 RuntimeSQLException이 발생하면 테스트 코드가 성공하는 코드입니다. 그리고 호출 순서를 따라가보면 Service에서 repository.call()을 먼저 호출하고 있습니다. 그리고 repository는
static class Repository {
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(e);
}
}
private void runSQL() throws SQLException {
throw new SQLException("ex");
}
}
이렇게 RuntimeSQLException을 던지고 있습니다. 아시다시피 로직은 예외가 발생하면 그 예외를 잡아서 처리해주지 않는 이상 그 다음 로직은 실행되지 않습니다. 그래서 RuntimeSQLException이 발생한 후의 로직
networkClient.call()은 실행되지 않고, 테스트 코드에서도 RuntimeSQLException 이 발생하길 기대한다고 테스트 코드를 짜셨기 때문에 해당 테스트 코드는 통과하게 됩니다 :)
감사합니다.
1
안녕하세요, jung님. 테스트 코드가 성공하는 이유에 대해 안내해드리겠습니다.
주어진 테스트 코드에서는 Controller 클래스의 controller() 메서드를 호출할 때 Assertions.assertThatThrownBy()를 사용하여 RuntimeSQLException이 throw되는지를 확인하고 있습니다.
하지만, 주어진 코드에는 Controller 클래스의 정의가 없기 때문에 정확한 답변을 드리기 어렵습니다. 또한, Service 클래스와 Repository, NetworkClient 클래스의 구현 내용이 없어 어떤 상황에서 어떤 예외가 발생하는지 파악하기 어렵습니다.
일반적으로 테스트 코드가 성공하려면, 예상한 예외가 throw되는 것을 확인해야 합니다. 따라서, 주어진 코드에서는 controller() 메서드가 RuntimeException 중 하나를 throw하도록 구현되어 있다면, 테스트 코드는 성공할 수 있습니다. 하지만, 실제 구현 코드와 예외 처리에 따라 테스트 결과는 다를 수 있습니다.
더 자세한 답변이 필요하시다면, 해당 코드의 구현 내용을 추가로 알려주시면 도움을 드릴 수 있을 것입니다. 감사합니다.