원인
서비스 계층의 테스트를 작성하면서 assertJ로 테스트를 작성했다.
Service계층은 DAO에 종속되어 메소드를 사용하기 때문에 DAO를 통해서 새로 만들어진 객체를 삭제해주어야 했고 DAO를 통해서 작업을 수행한다.
따라서 Service의 단위 테스트는 DAO에 종속되어 있었고 DAO 빈을 가져와서 일일히 값을 삭제하면서 테스트를 진행했다.
이런 불편한 점을 제거하고 단위 테스트가 DAO에 종속되지 않도록 만들기 위해서 Mockito 프레임워크를 적용해서 DAO에 대한 Mock 객체를 만들어 사용했다.
@SpringBootTest
public class AuthServiceTest {
private UserDTO user1;
private UserDTO user2;
private UserDTO user3;
private final UserDAO userDAO;
private final AuthService authService;
public AuthServiceTest(
@Autowired UserDAO userDAO,
@Autowired AuthService authService
){
this.userDAO = userDAO;
this.authService = authService;
}
@DisplayName("회원가입 테스트")
@Test
public void signUpTest(){
UserDTO test = this.authService.signUp(user1);
assertThat(user1.getEmail()).isEqualTo(test.getEmail());
}
@AfterEach
public void initDB(){
this.userDAO.deleteAllUser();
}
}
Mockito 프레임워크 적용
Mockito 프레임워크를 적용시켜 userDAO를 Mock 객체로 만들고 Bean으로 주입시켜줬다.
@ExtendWith(MockitoExtension.class)
@SpringBootTest
public class AuthServiceTest {
private UserDTO user1;
private UserDTO user2;
private UserDTO user3;
@MockBean
private UserDAO userDAO;
private final AuthService authService;
public AuthServiceTest(
@Autowired AuthService authService
){
this.authService = authService;
}
@MockBean 어노테이션을 달면 해당 Mock 객체가 애플리케이션 컨텍스트에 빈으로 등록되어 사용되어집니다.
따라서 AuthService에서 사용되어지는 UserDAO가 해당 Mock객체로 변환되기 때문에 일일히 디비에 저장된 데이터를 삭제할 필요가 없었습니다.
위에 나온 테스트를 아래와 같이 변경하였습니다.
@DisplayName("회원가입 테스트")
@Test
public void signUpTest(){
when(userDAO.createUser(any())).thenReturn(UserEntity.dtoToEntity(user1));
UserDTO test = this.authService.signUp(user1);
assertThat(user1.getEmail()).isEqualTo(test.getEmail());
}
실제로 동작하는 UserDAO가 아닌 Mock 객체를 만들어주었기 때문에 Mock 객체에 메소드에 대한 행위를 정의해 주어야 했습니다.
when 메소드를 통해 Mock객체가 어떤 메소드를 실행시킬 때 그에따른 리턴 값이나 동작을 정의할 수 있습니다.
저는 이 테스트에서 userDAO에 any() 어떤 값이 들어오던지 상관없이 user1에 대한 값을 반환하도록 만들었습니다.
따라서 Mock userDAO를 사용한 authService는 성공적으로 테스트를 완료했고 반환값의 이메일과 회원가입 이메일이 일치함을 볼 수 있었습니다.
알게된 점
@MockBean 어노테이션을 사용하여 Mock 객체를스프링 컨텍스트 (애플리케이션 컨텍스트)에 Bean으로 주입시켜줄 수 있다.
따라서 @Autowired 어노테이션을 통해 주입받은 AuthService가 Mock UserDAO를 가지고 있었다.
기존의 테스트에서 AuthService가 UserDAO에 종속되어 독립적인 테스트를 만들기 어려웠지만 Mock 객체를 활용해서 UserDAO에 종속되지 않은 독립적인 테스트를 만들 수 있었다.
'웹' 카테고리의 다른 글
[MSA] 마이크로서비스 아키텍처의 비동기 처리 (0) | 2024.01.09 |
---|---|
Spring Cloud Gateway JWT 인증, 인가 Filter 구현 및 적용 (0) | 2023.11.13 |
Image 데이터를 RestTemplate로 통신하면서 발생한 에러 (0) | 2023.11.13 |
Spring Cloud Eureka란? (0) | 2023.10.30 |
Spring Boot에서 보안을 위한 JWT를 발급하는 방법 (0) | 2023.10.27 |