서비스 테스트 코드
package shop.mtcoding.bank.service;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;
import shop.mtcoding.bank.service.UserService.JoinRequestDto;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks // 가짜환경에 넣는 것, @Autowired랑 다름
private UserService userService;
@Test
public void 회원가입_test() throws Exception {
// given
JoinRequestDto joinRequestDto = new JoinRequestDto();
joinRequestDto.setUsername("ssar");
joinRequestDto.setPassword("1234");
joinRequestDto.setEmail("ssar@nate.com");
joinRequestDto.setFullname("쌀");
// when
userService.회원가입(joinRequestDto);
// then
}
}
이전에 했던 통합 테스트와는 다른 어노테이션을 필요로한다. 주의하고 차이점을 이해하자. 서비스 테스트의 경우는 가짜환경에 넣는 것이다.
실행하면 null이 뜬다
왜냐하면 Mock 환경에는 Spring 빈들이 존재하지 않기 때문이다. 따라서 등록을 해줘야한다.
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks // 가짜환경에 넣는 것, @Autowired랑 다름
private UserService userService;
@Mock
private UserRepository userRepository;
.
.
.
@Mock를 붙인 레포지토리를 생성하면 userRespository가 가짜로 만들어지고, userService에 주입을 해준다.
실행
따라서 stub 처리가 필요하다. 가정을 하는 것
@Test
public void 회원가입_test() throws Exception {
// given
JoinRequestDto joinRequestDto = new JoinRequestDto();
joinRequestDto.setUsername("ssar");
joinRequestDto.setPassword("1234");
joinRequestDto.setEmail("ssar@nate.com");
joinRequestDto.setFullname("쌀");
// stub 1
when(userRepository.findByUsername(any())).thenReturn(Optional.empty());
// stub 2
User ssar = User.builder()
.id(1L)
.username("ssar")
.password("1234")
.email("ssar@nate.com")
.fullname("쌀")
.role(UserEnum.CUSTOMER)
.createAt(LocalDateTime.now())
.updateAt(LocalDateTime.now())
.build();
when(userRepository.save(any())).thenReturn(ssar);
// when
JoinResponseDto joinResponseDto = userService.회원가입(joinRequestDto);
// then
}
이유는 BCryt가 뜨지 않았기 때문이다.
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks // 가짜환경에 넣는 것, @Autowired랑 다름
private UserService userService;
@Mock
private UserRepository userRepository;
@Spy // 진짜를 를 userService에 넣는 것
private BCryptPasswordEncoder bCryptPasswordEncoder;
.
.
.
검증전 잘 작동하는지 확인, 바꿔보기
검증하기
@Test
public void 회원가입_test() throws Exception {
.
.
.
// when
JoinResponseDto joinResponseDto = userService.회원가입(joinRequestDto);
// then
assertThat(joinResponseDto.getId()).isEqualTo(1L);
assertThat(joinResponseDto.getUsername()).isEqualTo("ssar");
}
정리하면 서비스 테스트를 할때는 통합 테스트와 다르다