Mockito.thenThrow() 주의사항!

Posted at 2021. 9. 25. 03:23 | Posted in Framework/Spring
반응형

예외를 던지도록하는 테스트를 할 때 Exception 안에 메시지를 활용할 경우 Exception.class 를 사용하지말 고 new Exception()을 사용하자.

 

일단 예외 클래스를 보자

/**
 * 이미 종료된 대회일 때 예외
 *
 * @author jammini
 */
public class AlreadyContestEndException extends BadRequestException {
    public AlreadyContestEndException() {
        super("이미 종료된 대회입니다.");
    }
}

 

서비스를 모킹해서 예외를 던지도록 할 것이다.

@WebMvcTest(ContestInfoApi.class)
class ContestInfoApiTest extends WebMvcBase {
    @MockBean
    private ContestService contestService;
    
    @Test
    void alreadyContestEnd() throws Exception {
        // when
        // AlreadyContestEndException.class
        when(contestService.modify(anyLong(), any())).thenThrow(AlreadyContestEndException.class);
        
        // ...
    }
    
 }

 

@ControllerAdvice 를 이용해 예외 클래스 안의 message 속성을 사용할 경우!

/**
 * 웹 예외 핸들러<br>
 * 시스템상에 발생하는 예외를 잡아서 공통으로 처리한다.
 *
 * @author antop
 */
@Slf4j
@RestControllerAdvice
public class ErrorAdvisor {

    /**
     * 400 Bad Request 예외 처리
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(BadRequestException.class)
    ErrorMessage badRequest(Exception e) {
        log.debug("message = {}", e.getMessage());
        return ErrorMessage.badRequest(e.getMessage());
    }
    
  }

 

message는 null이 출력되게 된다. thenThrow() 인자로 new Exception() 을 사용하자.

when(contestService.modify(anyLong(), any())).thenThrow(new AlreadyContestEndException());

 

 

 

 

 

반응형

'Framework > Spring' 카테고리의 다른 글

Spring + @Lazy  (0) 2019.08.05
Twelve Best Practices For Spring XML Configurations  (0) 2010.06.23
//