Updated:

1. 개요

@WebMvcTest Annotation을 이용하여 Controller에 대한 Slice Test 작성 시, 예외에 대한 검증이 필요한 경우가 있다. assertThrows()로는 검증이 되지 않아 방법을 찾아보던 중, assertThatThrowsBy()를 이용하면 된다는 것을 알게 되었다. 이번에는 assertThatThrowsBy()를 이용하여 예외를 검증하는 방법에 대해 알아보도록 하자.

2. 개발 환경

  • Java 11

  • Spring Boot 2.5.3

3. 샘플 코드 작성

닉네임으로 사용자를 조회하여 존재하지 않는 경우 예외를 발생시키도록 한다.

[Account.java]

1
2
3
4
5
6
7
8
9
10
11
@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Account {

    @Id @GeneratedValue
    private Long id;

    private String nickname;
}

[AccountRepository.java]

1
2
3
4
5
public interface AccountRepository extends JpaRepository<Account, Long> {

    Account findByNickname(String nickname);
}

[AccountController.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
@RequiredArgsConstructor
public class AccountController {

    private final AccountRepository accountRepository;

    @GetMapping("/profile/{nickname}")
    public String viewProfile(@PathVariable String nickname, Model model) {
        Account byNickname = accountRepository.findByNickname(nickname);
        if(byNickname == null) {
            throw new IllegalArgumentException(nickname + "에 해당하는 사용자를 찾을 수 없습니다.");
        }

        return "account/profile";
    }
}

Line 9 : 전달받은 닉네임으로 사용자 정보를 조회

Line 10 ~ 12 : Line 9에서 조회한 사용자가 존재하지 않는 경우 예외 발생

4. 테스트 코드 작성

[AccountControllerTest.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebMvcTest(AccountController.class)
class AccountControllerTest {

    @Autowired MockMvc mockMvc;
    @MockBean AccountRepository accountRepository;

    @DisplayName("닉네임으로 프로필 페이지 보이는지 확인 - 존재하지 않는 사용자")
    @Test
    void viewProfile_not_exist_user() {
        assertThatThrownBy(() -> mockMvc.perform(get("/profile/aiden")))
                    .hasCause(new IllegalArgumentException("aiden에 해당하는 사용자를 찾을 수 없습니다."));
    }
}

Line 10 ~ 11 : assertThatThrownBy()를 이용하여 예외가 발생할 것으로 예상되는 API를 호출한 후 hasCause에 발생할 예외에 대한 정보를 입력

5. 테스트 결과

Updated:

Leave a comment