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를 진행할 수 있습니다!
위의 내용은 아래의 주소에서 확인할 수 있습니다.