22
33import static org .mockito .Mockito .*;
44
5- import java .util .Optional ;
6-
75import org .junit .jupiter .api .DisplayName ;
8- import org .junit .jupiter .api .Nested ;
96import org .junit .jupiter .api .Test ;
107import org .junit .jupiter .api .extension .ExtendWith ;
11- import org .mockito .* ;
12- import org .mockito .junit . jupiter . MockitoExtension ;
8+ import org .mockito .InjectMocks ;
9+ import org .mockito .Mock ;
1310import org .mockito .MockedStatic ;
11+ import org .mockito .junit .jupiter .MockitoExtension ;
1412import org .springframework .amqp .rabbit .core .RabbitTemplate ;
1513
1614import server .yakssok .domain .feedback .domain .entity .Feedback ;
1715import server .yakssok .domain .feedback .domain .repository .FeedbackRepository ;
1816import server .yakssok .domain .feedback .presentation .dto .request .CreateFeedbackRequest ;
19- import server .yakssok .domain .friend .domain .entity .Friend ;
20- import server .yakssok .domain .friend .domain .repository .FriendRepository ;
2117import server .yakssok .domain .notification .presentation .dto .NotificationDTO ;
2218import server .yakssok .domain .user .application .service .UserService ;
2319import server .yakssok .domain .user .domain .entity .User ;
@@ -30,139 +26,67 @@ class FeedbackServiceTest {
3026 private FeedbackService feedbackService ;
3127
3228 @ Mock private FeedbackRepository feedbackRepository ;
33- @ Mock private FriendRepository friendRepository ;
3429 @ Mock private UserService userService ;
3530 @ Mock private RabbitTemplate rabbitTemplate ;
3631 @ Mock private FeedbackQueueProperties feedbackQueueProperties ;
3732
3833 @ Mock private CreateFeedbackRequest createFeedbackRequest ;
3934
40- @ Nested
41- @ DisplayName ("sendFeedback" )
42- class SendFeedback {
43-
44- private final Long SENDER_ID = 10L ;
45- private final Long RECEIVER_ID = 20L ;
46-
47- private User mockSender () {
48- User u = mock (User .class );
49- when (u .getId ()).thenReturn (SENDER_ID );
50- return u ;
51- }
52-
53- private User mockReceiver () {
54- User u = mock (User .class );
55- when (u .getId ()).thenReturn (RECEIVER_ID );
56- return u ;
57- }
58-
59- private void stubCommonQueueProps () {
60- when (feedbackQueueProperties .exchange ()).thenReturn ("ex.feedback" );
61- when (feedbackQueueProperties .routingKey ()).thenReturn ("rk.feedback" );
62- }
63-
64- @ Test
65- @ DisplayName ("상대가 나를 팔로우하지 않을 때: OneWay 알림을 만들어 큐에 푸시한다" )
66- void oneWayFollow_pushesOneWayNotification () {
67- // given
68- User sender = mockSender ();
69- User receiver = mockReceiver ();
70- Feedback feedback = mock (Feedback .class );
71- NotificationDTO oneWayDto = mock (NotificationDTO .class );
72-
73- when (sender .getNickName ()).thenReturn ("senderNick" );
74- when (createFeedbackRequest .receiverId ()).thenReturn (RECEIVER_ID );
75- when (userService .getActiveUser (SENDER_ID )).thenReturn (sender );
76- when (userService .getActiveUser (RECEIVER_ID )).thenReturn (receiver );
77-
78- when (createFeedbackRequest .toFeedback (sender , receiver )).thenReturn (feedback );
79- when (friendRepository .findByUserIdAndFollowingId (RECEIVER_ID , SENDER_ID ))
80- .thenReturn (Optional .empty ());
81-
82- stubCommonQueueProps ();
83-
84- // NotificationDTO 정적 팩토리 모킹
85- try (MockedStatic <NotificationDTO > staticMock = mockStatic (NotificationDTO .class )) {
86- staticMock .when (() ->
87- NotificationDTO .fromOneWayFollowFeedback (
88- eq (SENDER_ID ),
89- eq ("senderNick" ),
90- eq (RECEIVER_ID ),
91- eq (feedback )))
92- .thenReturn (oneWayDto );
93-
94- // when
95- feedbackService .sendFeedback (SENDER_ID , createFeedbackRequest );
96-
97- // then
98- verify (userService ).getActiveUser (SENDER_ID );
99- verify (userService ).getActiveUser (RECEIVER_ID );
100-
101- verify (feedbackRepository ).save (feedback );
102-
103- // 정적 메서드가 호출되었는지 검증
104- staticMock .verify (() ->
105- NotificationDTO .fromOneWayFollowFeedback (
106- SENDER_ID , "senderNick" , RECEIVER_ID , feedback ));
107-
108- // 큐 전송 검증
109- verify (rabbitTemplate ).convertAndSend ("ex.feedback" , "rk.feedback" , oneWayDto );
110- verifyNoMoreInteractions (rabbitTemplate );
111- }
112- }
113-
114- @ Test
115- @ DisplayName ("상대가 나를 팔로우할 때(맞팔): Mutual 알림을 만들어 큐에 푸시한다" )
116- void mutualFollow_pushesMutualNotification () {
117- // given
118- User sender = mockSender ();
119- User receiver = mockReceiver ();
120- Feedback feedback = mock (Feedback .class );
121- Friend friend = mock (Friend .class );
122- NotificationDTO mutualDto = mock (NotificationDTO .class );
123-
124- when (receiver .getNickName ()).thenReturn ("receiverNick" );
125- when (createFeedbackRequest .receiverId ()).thenReturn (RECEIVER_ID );
126- when (userService .getActiveUser (SENDER_ID )).thenReturn (sender );
127- when (userService .getActiveUser (RECEIVER_ID )).thenReturn (receiver );
128-
129- when (createFeedbackRequest .toFeedback (sender , receiver )).thenReturn (feedback );
130-
131- when (friendRepository .findByUserIdAndFollowingId (RECEIVER_ID , SENDER_ID ))
132- .thenReturn (Optional .of (friend ));
133- when (friend .getRelationName ()).thenReturn ("bestie" );
134-
135- stubCommonQueueProps ();
136-
137- // NotificationDTO 정적 팩토리 모킹
138- try (MockedStatic <NotificationDTO > staticMock = mockStatic (NotificationDTO .class )) {
139- staticMock .when (() ->
140- NotificationDTO .fromMutualFollowFeedback (
141- eq (SENDER_ID ),
142- eq (RECEIVER_ID ),
143- eq ("receiverNick" ),
144- eq ("bestie" ),
145- eq (feedback )))
146- .thenReturn (mutualDto );
147-
148- // when
149- feedbackService .sendFeedback (SENDER_ID , createFeedbackRequest );
150-
151- // then
152- verify (userService ).getActiveUser (SENDER_ID );
153- verify (userService ).getActiveUser (RECEIVER_ID );
154-
155- verify (feedbackRepository ).save (feedback );
156-
157- // 정적 메서드 호출 검증
158- staticMock .verify (() ->
159- NotificationDTO .fromMutualFollowFeedback (
160- SENDER_ID , RECEIVER_ID , "receiverNick" , "bestie" , feedback ));
161-
162- // 큐 전송 검증
163- verify (rabbitTemplate ).convertAndSend ("ex.feedback" , "rk.feedback" , mutualDto );
164- verifyNoMoreInteractions (rabbitTemplate );
165- }
35+ @ Test
36+ @ DisplayName ("피드백 전송: Feedback 저장 후 DTO를 만들어 큐에 푸시한다" )
37+ void sendFeedback_pushesNotificationToQueue () {
38+ // given
39+ final Long SENDER_ID = 10L ;
40+ final Long RECEIVER_ID = 20L ;
41+
42+ User sender = mock (User .class );
43+ User receiver = mock (User .class );
44+ Feedback feedback = mock (Feedback .class );
45+ NotificationDTO dto = mock (NotificationDTO .class );
46+
47+ when (sender .getId ()).thenReturn (SENDER_ID );
48+ when (sender .getNickName ()).thenReturn ("senderNick" );
49+ when (receiver .getId ()).thenReturn (RECEIVER_ID );
50+
51+ when (createFeedbackRequest .receiverId ()).thenReturn (RECEIVER_ID );
52+ when (userService .getActiveUser (SENDER_ID )).thenReturn (sender );
53+ when (userService .getActiveUser (RECEIVER_ID )).thenReturn (receiver );
54+
55+ when (createFeedbackRequest .toFeedback (sender , receiver )).thenReturn (feedback );
56+
57+ when (feedbackQueueProperties .exchange ()).thenReturn ("ex.feedback" );
58+ when (feedbackQueueProperties .routingKey ()).thenReturn ("rk.feedback" );
59+
60+ // NotificationDTO 정적 팩토리 모킹
61+ try (MockedStatic <NotificationDTO > staticMock = mockStatic (NotificationDTO .class )) {
62+ staticMock .when (() ->
63+ NotificationDTO .fromFeedback (
64+ eq (SENDER_ID ),
65+ eq ("senderNick" ),
66+ eq (RECEIVER_ID ),
67+ eq (feedback )))
68+ .thenReturn (dto );
69+
70+ // when
71+ feedbackService .sendFeedback (SENDER_ID , createFeedbackRequest );
72+
73+ // then
74+ // 유저 조회 및 저장 호출
75+ verify (userService ).getActiveUser (SENDER_ID );
76+ verify (userService ).getActiveUser (RECEIVER_ID );
77+ verify (feedbackRepository ).save (feedback );
78+
79+ // 정적 메서드 호출 검증
80+ staticMock .verify (() ->
81+ NotificationDTO .fromFeedback (SENDER_ID , "senderNick" , RECEIVER_ID , feedback ));
82+
83+ // 큐 전송 검증
84+ verify (feedbackQueueProperties ).exchange ();
85+ verify (feedbackQueueProperties ).routingKey ();
86+ verify (rabbitTemplate ).convertAndSend ("ex.feedback" , "rk.feedback" , dto );
87+
88+ // 불필요 상호작용 없음
89+ verifyNoMoreInteractions (rabbitTemplate , feedbackRepository , userService , feedbackQueueProperties );
16690 }
16791 }
16892}
0 commit comments