TestCode

Mock 사용하기 (@Mock, @InjectMocks, @Spy)

salmon16 2024. 7. 16. 16:17

개요

MockBean을 사용하면 스프링 컨테이너의 빈이 MockBean으로 대체되어 사용된다. 

이와 반대로 단위 테스트를 진행하기 위해 스프링 컨테이너를 실행하기엔 무거울 수 있어 Mock을 사용한다.

즉 Mock은 스프링과 무관하며, 그저 단순한 Mock객체를 만들어주는 어노테이션이기 때문에 스프링 컨텍스트에는 실제 객체가 Bean으로 남아있게 된다.

 

사용법

1. 아래의 코드와 같이 Mock을 만들 클래스 타입을 Mockito.mock의 인자로 넣어주면 된다.

MailSendClient = mailSendClient = Mockito.mock(MilSendClient.class);

MailService mailService = new MailSerivce(mailSendClient);


when(mailSendClient.sendEmail(anyString()).thenReturn(true);

 

2. @Mock을 사용하면 1번 방법과 동일한 효과를 적용할 수 있다.

그러기 위해선 테스트클래스 위에 @ExtendWith(MockitoExtension.class)를 추가해 주면 된다.

@ExtendWith(MockitoExtension.class)
class MailServiceTest {

	@Mock
    private MailSendClient mailSendClient;

 

@InjectMocks

injectMocks를 사용하면 생성자를 통해 필요한 의존관계를 자동으로 주입시켜준다.

@InjectMocks
    private MailService mailService;

 

@Spy

 

만약 테스트에 사용하는 클래스의 모든 함수를 Mock 하는 경우가 아닌 사용자가 선택해서 테스트를 진행하고 싶은 경우 사용한다. 

지정한 함수 말고는 기본의 코드대로 수행된다.

 

@Spy
    private MailSendClient mailSendClient;
    
    doReturn(true)
                .when(mailSendClient)
                .sendEmail(anyString(), anyString(), anyString(), anyString());

 

mailsendClient의 sendEmail함수만 Mock 된 것처럼 호출 시 true를 리턴하고 나머지 함수는 기존의 코드와 같게 수행된다.

'TestCode' 카테고리의 다른 글

classicist vs mockist  (0) 2024.07.17
Mockito.verify  (0) 2024.07.16
JUnit 예외 상황 테스트 하기  (0) 2024.07.15
JUnit 객체의 필드 값 확인하기  (0) 2024.07.15
Mockito 사용하기  (0) 2024.07.13