LinkedIn

@MockBean Spring Context Recreated

2021. 5. 24. 22:53 | 자바 개발자되기

1. 현상

  • @SpringBootTest로 통합 테스트를 관리하는 경우 테스트 시작 시 SQL Script를 통해 H2 in-memory-database에 초기화를 진행할 때 스크립트 중복 실행이 발생하여 DB Exception 발생
  • 기본적으로 Spring boot JDBC Initializer는 fail-fast 전략으로 스크립트 실행 중 에러가 발생하면 중단시킴

 

2. 원인

  • 통합테스트를 위해 필요한 Configuration을 정의 후 사용, 일부 테스트에서 개별적으로 @MockBean을 사용하여 Spring Context Recreated를 유발
Any existing single bean of the same type defined in the context will be replaced by the mock. If no existing bean is defined a new one will be added.
  • @MockBean을 사용할 경우 Spring Context에 이미 Bean이 존재하더라도 대체. 각 테스트마다 @MockBean이 사용된다면 개별적인 Spring Context가 생성.

 

3. 해결 방안

  • application.properties에 아래의 옵션 추가. 실행 중 스크립트로 인한 에러가 발생해도 중지하지 않음(Fail-Safe)
spring.datasource.continue-on-error=true
  • @MockBean 어노테이션을 각 테스트 클래스마다 사용하지 말고 필요 한 부분을 추출하여 공통 Configuration으로 관리

 

- https://github.com/spring-projects/spring-boot/issues/10015