방법1
public class MailServiceTest {
@DisplayName("메일 전송 테스트")
@Test
void sendMail() {
// given
MailSendClient mailSendClient = Mockito.mock(MailSendClient.class);
final MailSendHistoryRepository mailSendHistoryRepository = Mockito.mock(MailSendHistoryRepository.class);
final MailService mailService = new MailService(mailSendClient, mailSendHistoryRepository);
Mockito.when(mailSendClient.sendEmail(anyString(), anyString(), anyString(), anyString()))
.thenReturn(true);
// when
boolean result = mailService.sendMail("", "", "", "");
// then
assertThat(result).isTrue();
// mailSendHistoryRepository를 save를 하는데 인자로 MailSendHistory를 준다. save라는 행위가 1번 불리는지 검증하는 메서드
Mockito.verify(mailSendHistoryRepository, Mockito.times(1)).save(any(MailSendHistory.class));
}
}
방법2
어노테이션을 사용함.
@ExtendWith(MockitoExtension.class)
클래스레벨에 Mockito를 사용해서 Mock을 만들것이라는걸 명시해주어야함.
@ExtendWith(MockitoExtension.class)
public class MailServiceTest {
@Mock
private MailSendClient mailSendClient;
@Mock
private MailSendHistoryRepository mailSendHistoryRepository;
@InjectMocks
private MailService mailService;
@DisplayName("메일 전송 테스트")
@Test
void sendMail() {
// given
// MailSendClient mailSendClient = Mockito.mock(MailSendClient.class);
// final MailSendHistoryRepository mailSendHistoryRepository = Mockito.mock(MailSendHistoryRepository.class);
//
// final MailService mailService = new MailService(mailSendClient, mailSendHistoryRepository);
Mockito.when(mailSendClient.sendEmail(anyString(), anyString(), anyString(), anyString()))
.thenReturn(true);
// when
boolean result = mailService.sendMail("", "", "", "");
// then
assertThat(result).isTrue();
// mailSendHistoryRepository를 save를 하는데 인자로 MailSendHistory를 준다. save라는 행위가 1번 불리는지 검증하는 메서드
Mockito.verify(mailSendHistoryRepository, Mockito.times(1)).save(any(MailSendHistory.class));
}
}
@InjectMocks은 DI같이 필요한 빈들을 인젝션을 해준다.
위 코드에서 설명을 하자면 MailService에 mailSendHistoryRepository와 mailSendClient 를 인젝션을 해준다고 생각하면 됨