일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- AOP
- 우아한세미나
- mock
- 서블릿
- Spring Batch
- AWS
- 우아한테크코스
- CircuitBreaker
- JUnit5
- Level2
- 코드리뷰
- 우테코
- 스프링부트
- 의존성
- MSA
- 프리코스
- 레벨2
- 스프링 부트
- yml
- 세션
- 백준
- 미션
- REDIS
- 자바
- HTTP
- 프로그래머스
- 트랜잭션
- Docker
- JPA
- Paging
Archives
- Today
- Total
늘
@Mock vs @MockBean vs @InjectMocks 본문
728x90
@Mock
@ExtendWith(MockitoExtension.class)를 클래스 위에 붙여준다.
@ExtendWith(MockitoExtension.class)
public class MockTests {
@Mock
private OrderRepository orderRepository;
@InjectMocks
private OrderService orderService;
}
@InjectMocks를 사용하면 @Mock으로 만들어진 인스턴스들을 자동으로 주입해준다.
(위 예시에서는 OrderService가 OrderRepository를 주입받는 클래스 존재)
@MockBean
@SpringBootTest
public class MockTests {
@MockBean
private OrderRepository orderRepository;
@Autowired
private OrderService orderService;
}
@MockBean이 붙으면 mock객체를 스프링 컨텍스트에 등록하게 된다. 그 후, @Autowired로 스프링 컨텍스트에 등록된 mock 객체들을 주입받아서 의존성 처리를 해준다.
만약 application context에 같은 타입의 빈이 존재한다면 해당 빈을 mock으로 교체한다. 같은 타입의 빈이 존재하지 않는다면, 해당 mock 객체를 빈으로 추가해준다. 이 어노테이션은 통합 테스트를 진행할 때에 mock을 사용해야하는 상황의 특정 빈의 경우에 유용하다.
(여기서 @MockBean으로 하고 @InjectMocks를 해주면 작동하지 않는다. 왜냐하면 @MockBean은 스프링 컨텍스트에 등록을 하여 사용되지만 @InjectMocks는 스프링 컨텍스트에서 빈을 찾지 않으므로 의존성 주입에 실패한다. 따라서 NPE가 발생한다.)
Mock 종류 | 의존성 주입 Target |
@Mock | @InjectMocks |
@MockBean | @SpringBootTest |
만약 통합 테스트라면 @MockBean을 사용하면 될 것이고, 여타 다른 spring 빈들이 필요가 없고 특정 빈들만 mock으로 가지고 있으면 된다면 @Mock을 이용한 테스트를 진행하면 될 것 같다.
Reference
728x90
'백앤드 개발일지 > 스프링부트' 카테고리의 다른 글
[프록시] 스프링에서 사용되는 proxy전략 (2) | 2022.07.23 |
---|---|
[RestDocs]API 문서화 (2) | 2022.06.03 |
[Spring bean lifecycle, hook]빈 생명주기 (0) | 2022.05.23 |
@RestController와 @ResponseBody없이 json으로 통신하는 방법 (2) | 2022.04.30 |
@RequestBody와 @ModelAttribute 차이 (0) | 2022.04.27 |
Comments