22
33import com .recyclestudy .exception .EmailSendException ;
44import com .recyclestudy .member .domain .Email ;
5- import jakarta .mail .MessagingException ;
6- import jakarta .mail .internet .MimeMessage ;
5+ import org .assertj .core .api .SoftAssertions ;
76import org .junit .jupiter .api .DisplayName ;
87import org .junit .jupiter .api .Test ;
98import org .junit .jupiter .api .extension .ExtendWith ;
9+ import org .mockito .ArgumentCaptor ;
1010import org .mockito .InjectMocks ;
1111import org .mockito .Mock ;
1212import org .mockito .junit .jupiter .MockitoExtension ;
13- import org .springframework .mail .javamail .JavaMailSender ;
13+ import software .amazon .awssdk .core .exception .SdkClientException ;
14+ import software .amazon .awssdk .services .sesv2 .SesV2Client ;
15+ import software .amazon .awssdk .services .sesv2 .model .SendEmailRequest ;
16+ import software .amazon .awssdk .services .sesv2 .model .SesV2Exception ;
1417
1518import static org .assertj .core .api .Assertions .assertThatThrownBy ;
1619import static org .mockito .ArgumentMatchers .any ;
17- import static org .mockito .BDDMockito .given ;
1820import static org .mockito .BDDMockito .willThrow ;
19- import static org .mockito .Mockito .mock ;
2021import static org .mockito .Mockito .verify ;
2122
2223@ ExtendWith (MockitoExtension .class )
2324class EmailSenderTest {
2425
2526 @ Mock
26- private JavaMailSender javaMailSender ;
27+ private SesV2Client sesV2Client ;
2728
2829 @ InjectMocks
2930 private EmailSender emailSender ;
@@ -35,32 +36,52 @@ void send_success() {
3536 final Email targetEmail = Email .from ("test@test.com" );
3637 final String subject = "테스트 제목" ;
3738 final String content = "<html>테스트 내용</html>" ;
38- final MimeMessage mimeMessage = mock (MimeMessage .class );
39-
40- given (javaMailSender .createMimeMessage ()).willReturn (mimeMessage );
4139
4240 // when
4341 emailSender .send (targetEmail , subject , content );
4442
4543 // then
46- verify (javaMailSender ).createMimeMessage ();
47- verify (javaMailSender ).send (mimeMessage );
44+ ArgumentCaptor <SendEmailRequest > captor = ArgumentCaptor .forClass (SendEmailRequest .class );
45+ verify (sesV2Client ).sendEmail (captor .capture ());
46+ SendEmailRequest request = captor .getValue ();
47+ SoftAssertions .assertSoftly (softly -> {
48+ softly .assertThat (request .fromEmailAddress ()).isEqualTo ("noreply@recycle-study.site" );
49+ softly .assertThat (request .destination ().toAddresses ()).containsExactly ("test@test.com" );
50+ softly .assertThat (request .content ().simple ().subject ().data ()).isEqualTo (subject );
51+ });
4852 }
4953
5054 @ Test
5155 @ DisplayName ("메일 발송 실패 시 EmailSendException을 던진다" )
52- void send_fail_throwsException () throws MessagingException {
56+ void send_fail_throwsException () {
5357 // given
5458 final Email targetEmail = Email .from ("test@test.com" );
5559 final String subject = "테스트 제목" ;
5660 final String content = "<html>테스트 내용</html>" ;
57- final MimeMessage mimeMessage = mock (MimeMessage .class );
5861
59- given (javaMailSender .createMimeMessage ()).willReturn (mimeMessage );
60- willThrow (new MessagingException ("메일 서버 오류" ))
61- .given (mimeMessage ).setRecipient (any (), any ());
62+ willThrow (SesV2Exception .builder ().message ("SES 오류" ).build ())
63+ .given (sesV2Client ).sendEmail (any (SendEmailRequest .class ));
6264
63- // when & then
65+ // when
66+ // then
67+ assertThatThrownBy (() -> emailSender .send (targetEmail , subject , content ))
68+ .isInstanceOf (EmailSendException .class )
69+ .hasMessage ("메일 전송 중 오류가 발생했습니다." );
70+ }
71+
72+ @ Test
73+ @ DisplayName ("네트워크 오류 시 EmailSendException을 던진다" )
74+ void send_fail_networkError_throwsEmailSendException () {
75+ // given
76+ final Email targetEmail = Email .from ("test@test.com" );
77+ final String subject = "테스트 제목" ;
78+ final String content = "<html>테스트 내용</html>" ;
79+
80+ willThrow (SdkClientException .create ("네트워크 오류" ))
81+ .given (sesV2Client ).sendEmail (any (SendEmailRequest .class ));
82+
83+ // when
84+ // then
6485 assertThatThrownBy (() -> emailSender .send (targetEmail , subject , content ))
6586 .isInstanceOf (EmailSendException .class )
6687 .hasMessage ("메일 전송 중 오류가 발생했습니다." );
0 commit comments