Spring

[Spring] 단위 테스트

hyeon1212 2023. 9. 13. 12:29

통합 테스트

  • 운영 환경과 가장 유사하게 동작시키기 위해서 @SpringBootTest 이용
  • @SpringBootTest 는 정의된 모든 빈 생성 → 시간 소요됨
  • @WebMvcTest요청을 처리하기 위한 빈들로 제한하여 로딩 → 상대적으로 가벼움

 

단위 테스트

  • @RunWith(MockitoJUnitRunner.class) @Mock 객체를 실행하는 동안 사용할 수 있게
  • @Mock@MockBean Spring Boot에서 제공되며, Spring context에 올라가게 됨
  • 주로 @Mock가 단위 테스트로 사용이 됨

 

<수정 전>

@SpringBootTest
@Transactional
@Rollback
class UserServiceImplTest {
    @Autowired private UserRepository userRepository;

    @Test
    public void saveUser() {
        SignupDto signupDto = SignupDto.builder()
                .email("test")
                .password("test")
                .name("test")
                .nickname("test")
                .corp(true)
                .build();

        User user = signupDto.toUser();
        User findUser = userRepository.save(user);
        Assertions.assertThat(findUser.getNickname().equals("test"));

    }
}

 

<수정 후>

@RunWith(MockitoJUnitRunner.class) // Mock 사용할 수 있게
@TestPropertySource(locations = "/application-test.properties") // 다른 db와 연결
class UserServiceImplTest {

    @MockBean // 테스트 분리 -> 단위 테스트 : 실제 동작에 관여하지 않는 빈은 필요 없음
    private UserRepository userRepository;

    @MockBean // Spring context에 올라감
    private ProfileRepository profileRepository;

    @MockBean
    private PasswordEncoder passwordEncoder;

    @InjectMocks
    private UserServiceImpl userService = new UserServiceImpl(userRepository, profileRepository, passwordEncoder);

    @DisplayName("존재하는 유저는 프로필 조회가 가능하다.")
    @Test
    public void saveUser() {

        // given
        SignupDto signupDto = SignupDto.builder()
                .email("test")
                .password("test")
                .name("test")
                .nickname("test")
                .corp(true)
                .build();

        User user = signupDto.toUser();
        User saveUser = userService.save(user);

        // when
        User findUser = userService.findProfile(saveUser.getId());

        // then
        Assertions.assertThat(findUser.getNickname().equals("test"));

    }
}

 

변경 내용

  • 통합 테스트 → 단위 테스트 : @RunWith(MockitoJUnitRunner.class) 이용
  • dependencies 추가
    • org.mockito:mockito-core:3.12.4
    • org.mockito:mockito-junit-jupiter:3.12.4
  • 사용할 service의 의존성에 의해서 @Mock 레포지토리들을 @InjectMocks 의 인자 값으로 넘김

⇒ 이에 따라 상대적으로 가벼운 test를 진행할 수 있습니다!

 

 

위의 내용은 아래의 주소에서 확인할 수 있습니다.

https://github.com/12hyeon/ApplePie_Upgrade