아래와 같이 어노테이션을 붙인다.
@ExtendWith(MockitoExtension.class)
public class BookServiceTest {
가짜의존성을 아래처럼 주입한다. 또한 MailSenderStub이 아닌 MailSender 인터페이스를 넣는다.
@InjectMocks
private BookService bookService;
@Mock
private BookRepository bookRepository;
@Mock
private MailSender mailSenDer;
그리고 책등록하기_테스트 메서드를 아래와 같이 바꾼다.
@Test
public void 책등록하기_테스트() {
// given
BookSaveReqDto dto = new BookSaveReqDto();
dto.setTitle("junit lecture");
dto.setAuthor("momo");
// stub
when(bookRepository.save(ArgumentMatchers.any())).thenReturn(dto.toEntity());
when(mailSenDer.send()).thenReturn(true);
// when
BookRespDto bookRespDto = bookService.책등록하기(dto);
// then
// assertEquals(dto.getTitle(), bookRespDto.getTitle());
// assertEquals(dto.getAuthor(), bookRespDto.getAuthor());
assertThat(bookRespDto.getTitle()).isEqualTo(dto.getTitle());
assertThat(bookRespDto.getAuthor()).isEqualTo(dto.getAuthor());
}
when에서 any()를 쓰기전에는 똑같이 dto.toEntity()를 썻더니 두 객체의 매모리가 다르다고 나오면서 테스트 실패가 떳다. 그것에 대한 해결방편이 any()이다. 무엇이 들어오든 dto.toEntity()를 리턴하라는 것이다.
마지막에 쓰인 assertThat은 assertJ라는 라이브러리에서 가져와서 쓴것이다. 그동안 쓰던 assertEquals는 생성자처럼 생겨서 좀 불편한데, 이것은 빌더와 유사해서(빌더패턴인지도 모르겠다.) 알아보기 편했다.