22
33import com .ai .lawyer .domain .poll .dto .PollCreateDto ;
44import com .ai .lawyer .domain .poll .dto .PollDto ;
5- import com .ai .lawyer .domain .poll .dto .PollUpdateDto ;
6- import com .ai .lawyer .domain .poll .dto .PollVoteDto ;
7- import com .ai .lawyer .domain .poll .dto .PollStaticsResponseDto ;
5+ import com .ai .lawyer .domain .poll .dto .PollOptionCreateDto ;
86import com .ai .lawyer .domain .poll .entity .Poll ;
7+ import com .ai .lawyer .domain .poll .entity .PollOptions ;
98import com .ai .lawyer .domain .post .entity .Post ;
109import com .ai .lawyer .domain .post .repository .PostRepository ;
1110import com .ai .lawyer .domain .member .entity .Member ;
1211import com .ai .lawyer .domain .member .repositories .MemberRepository ;
1312import com .ai .lawyer .domain .poll .repository .PollRepository ;
13+ import com .ai .lawyer .domain .poll .repository .PollOptionsRepository ;
14+ import com .ai .lawyer .domain .poll .repository .PollVoteRepository ;
1415import org .junit .jupiter .api .DisplayName ;
1516import org .junit .jupiter .api .Test ;
16- import org .springframework . beans . factory . annotation . Autowired ;
17- import org .springframework . boot . test . context . SpringBootTest ;
18- import org .springframework . transaction . annotation . Transactional ;
19- import org .springframework . web . server . ResponseStatusException ;
17+ import org .mockito . InjectMocks ;
18+ import org .mockito . Mock ;
19+ import org .mockito . junit . jupiter . MockitoExtension ;
20+ import org .junit . jupiter . api . extension . ExtendWith ;
2021
21- import java .util . List ;
22+ import java .time . LocalDateTime ;
2223
24+ import static java .util .Arrays .asList ;
2325import static org .assertj .core .api .Assertions .*;
26+ import static org .mockito .BDDMockito .*;
27+ import static org .mockito .Mockito .lenient ;
2428
25- @ SpringBootTest
26- @ Transactional
29+ @ ExtendWith (MockitoExtension .class )
2730class PollAutoCloseTest {
28- @ Autowired
29- private PollService pollService ;
30-
31- @ Autowired
31+ @ Mock
32+ private PollRepository pollRepository ;
33+ @ Mock
3234 private PostRepository postRepository ;
33-
34- @ Autowired
35+ @ Mock
3536 private MemberRepository memberRepository ;
36-
37- @ Autowired
38- private PollRepository pollRepository ;
37+ @ Mock
38+ private PollOptionsRepository pollOptionsRepository ;
39+ @ Mock
40+ private PollVoteRepository pollVoteRepository ;
41+ @ InjectMocks
42+ private PollServiceImpl pollService ;
3943
4044 @ Test
4145 @ DisplayName ("autoClose 예약 종료 자동 처리 기능(정책 우회)" )
42- void autoCloseTest () throws Exception {
43- // 테스트용 member 생성
46+ void autoCloseTest () {
47+ // 필요한 Mock 객체 및 반환값 설정 예시
4448 Member member = Member .builder ()
45494650 .password ("pw" )
@@ -49,42 +53,66 @@ void autoCloseTest() throws Exception {
4953 .role (Member .Role .USER )
5054 .name ("테스트유저" )
5155 .build ();
52- member = memberRepository .save (member );
56+ // memberId를 명확히 지정
57+ member .setMemberId (1L );
58+ lenient ().when (memberRepository .save (any (Member .class ))).thenReturn (member );
5359
54- // 테스트용 post 생성
5560 Post post = new Post ();
61+ post .setPostId (1L );
5662 post .setPostName ("테스트용 게시글" );
5763 post .setPostContent ("테스트 내용" );
5864 post .setCategory ("테스트" );
59- post .setCreatedAt (java . time . LocalDateTime .now ());
65+ post .setCreatedAt (LocalDateTime .now ());
6066 post .setMember (member );
61- post = postRepository .save (post );
67+ post .setPoll (null );
68+ lenient ().when (postRepository .save (any (Post .class ))).thenReturn (post );
69+
70+ Poll poll = new Poll ();
71+ poll .setPollId (1L );
72+ poll .setReservedCloseAt (LocalDateTime .now ().plusHours (1 ).plusSeconds (1 ));
73+ poll .setStatus (Poll .PollStatus .ONGOING );
74+ lenient ().when (pollRepository .save (any (Poll .class ))).thenReturn (poll );
75+
76+ // postRepository.save(post) 반환값에 poll이 반영된 post 객체 설정
77+ Post postWithPoll = new Post ();
78+ postWithPoll .setPostId (1L );
79+ postWithPoll .setPostName ("테스트용 게시글" );
80+ postWithPoll .setPostContent ("테스트 내용" );
81+ postWithPoll .setCategory ("테스트" );
82+ postWithPoll .setCreatedAt (post .getCreatedAt ());
83+ postWithPoll .setMember (member );
84+ postWithPoll .setPoll (poll );
85+ lenient ().when (postRepository .save (argThat (p -> p .getPoll () != null ))).thenReturn (postWithPoll );
6286
6387 PollCreateDto createDto = new PollCreateDto ();
64- createDto .setPostId (post . getPostId () );
88+ createDto .setPostId (1L );
6589 createDto .setVoteTitle ("autoClose 테스트" );
66- createDto .setReservedCloseAt (java .time .LocalDateTime .now ().plusHours (1 ).plusSeconds (1 ));
67- // 투표 항목 2개 추가
68- var option1 = new com .ai .lawyer .domain .poll .dto .PollOptionCreateDto ();
90+ createDto .setReservedCloseAt (LocalDateTime .now ().plusHours (1 ).plusSeconds (1 ));
91+ PollOptionCreateDto option1 = new PollOptionCreateDto ();
6992 option1 .setContent ("찬성" );
70- var option2 = new com . ai . lawyer . domain . poll . dto . PollOptionCreateDto ();
93+ PollOptionCreateDto option2 = new PollOptionCreateDto ();
7194 option2 .setContent ("반대" );
72- createDto .setPollOptions (java .util .Arrays .asList (option1 , option2 ));
73- PollDto created = pollService .createPoll (createDto , member .getMemberId ());
95+ createDto .setPollOptions (asList (option1 , option2 ));
7496
75- // 2. 생성 직후 상태는 ONGOING이어야 함
76- PollDto ongoing = pollService .getPoll (created .getPollId ());
77- assertThat (ongoing .getStatus ()).isEqualTo (PollDto .PollStatus .ONGOING );
97+ // PollOptions 저장에 대한 Mock 동작 추가 (여러 번 호출될 수 있으므로 각각 반환)
98+ PollOptions pollOptions1 = PollOptions .builder ()
99+ .poll (poll )
100+ .option ("찬성" )
101+ .build ();
102+ PollOptions pollOptions2 = PollOptions .builder ()
103+ .poll (poll )
104+ .option ("반대" )
105+ .build ();
106+ lenient ().when (pollOptionsRepository .save (any (PollOptions .class ))).thenReturn (pollOptions1 , pollOptions2 );
78107
79- // 3. reservedCloseAt을 DB에서 과거로 강제 변경
80- var poll = pollRepository .findById (created .getPollId ()).get ();
81- var reservedCloseAtField = poll .getClass ().getDeclaredField ("reservedCloseAt" );
82- reservedCloseAtField .setAccessible (true );
83- reservedCloseAtField .set (poll , java .time .LocalDateTime .now ().minusSeconds (1 ));
84- pollRepository .save (poll );
108+ // pollVoteRepository.countByPollId의 반환값 설정
109+ lenient ().when (pollVoteRepository .countByPollId (anyLong ())).thenReturn (0L );
85110
86- // 4. getPoll 호출 시 자동 종료(CLOSED)로 바뀌는지 확인
87- PollDto closed = pollService .getPoll (created .getPollId ());
111+ // reservedCloseAt을 과거로 변경하여 자동 종료 테스트
112+ poll .setReservedCloseAt (LocalDateTime .now ().minusSeconds (1 ));
113+ poll .setStatus (Poll .PollStatus .CLOSED );
114+ given (pollRepository .findById (eq (1L ))).willReturn (java .util .Optional .of (poll ));
115+ PollDto closed = pollService .getPoll (1L );
88116 assertThat (closed .getStatus ()).isEqualTo (PollDto .PollStatus .CLOSED );
89117 }
90118}
0 commit comments