Junit Test Application-11-회원가입 서비스 JUnit 테스트

jaegeunsong97·2023년 8월 4일
0

Junit Bank Application 깃허브

Junit Bank Application 기록 노션

서비스 테스트 코드

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");
     }

정리하면 서비스 테스트를 할때는 통합 테스트와 다르다

  • @ExtendWith : 가짜환경만 세팅
  • @InjectMocks : 가짜 환경에 집어 넣는 것(주입이 아님)
  • @Mock : 가짜 객체를 만들어 @InjectMocks에 주입
  • @Spy : 진짜 객체를 만들어 @InjectMocks에 주입
profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글