Unit Test ?
๋จ์ ํ ์คํธ๋ Service Layer์ ๋น์ฆ๋์ค ๋ก์ง๋ง์ ๊ฒ์ฆํ๋ ๊ฒ์ด๋ฏ๋ก, Repository์ Controller์ ์ํฅ์ ๋ฐ์ง ์๋ ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์งํํ์ฌ์ผ ํ๋ค.
ํ ์คํธ์ F.I.R.S.T ์์น
F - Fast: ํ ์คํธ๋ฅผ ์๋ํ๋ ๊ฒ์ ์์ด์ ์ฃผ์ถค๋์ง ์์ ๋งํผ ๋นจ๋ผ์ผ ํ๋ค.
I - Independent: ๊ฐ์ฒด์ ์ํ, ๋ฉ์๋, ์ด์ ํ ์คํธ ์ํ, ๋ค๋ฅธ ๋ฉ์๋์ ๊ฒฐ๊ณผ์ ์์กดํด์๋ ์๋๋ค.
R - Repeatable: ์ด๋ค ํ๊ฒฝ์์๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋๋ก ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค.
S - Self-Validating: ๋ชจ๋ ํ ์คํธ๋ pass ํน์ fail์ ๊ฒฐ๊ณผ๋ง ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
T - Timely: ์ค์ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ ์ ํ ์คํธ ๋์ด์ผ ํ๋ค. ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ ํ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๋ฉด, ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ก ์ค์ ์ฝ๋๋ฅผ ์ค๊ณํ ์ง๋ ๋ชจ๋ฅธ๋ค.
Mockito
์๋ฐ์์ ๋จ์ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํด Mock์ ๋ง๋ค์ด์ฃผ๋ ํ๋ ์์ํฌ
Mock
์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ธฐ์ ์๊ฐ, ๋น์ฉ๋ฑ์ Cost๊ฐ ๋๊ฑฐ๋ ํน์ ๊ฐ์ฒด ์๋ก๊ฐ์ ์์กด์ฑ์ด ๊ฐํด ๊ตฌํ์ด ํ๋ค ๊ฒฝ์ฐ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ฌ์ฉ๋ฒ: https://github.com/mockito/mockito/wiki/Mockito-features-in-Korean
Service Test ์์ฑ
@ExtendWith(MockitoExtension.class)
class SafetyInfoServiceTest {
@InjectMocks
private SafetyInfoServiceImpl safetyInfoService;
@Mock
private SafetyInfoRepository safetyInfoRepository;
@Mock
private UserRepository userRepository;
@Mock
private SafetyInfoQueryRepository safetyInfoQueryRepository;
final String userEmail = "test@gmail.com";
void setup(){
User user = User.builder().build();
given(userRepository.findByEmail(userEmail)).willReturn(Optional.of(user));
}
@Test
void findAllSafetyInfo() {
// given
setup();
List<FindSafetyInfoResDto> expected = new ArrayList<>();
given(safetyInfoQueryRepository.findAllWithUserId(any())).willReturn(expected);
// when
List<FindSafetyInfoResDto> response = safetyInfoService.findAllSafetyInfo(userEmail);
// then
assertThat(response).isEqualTo(expected);
}
}
@ExtendWith(MockitoExtension.class)
SpringContainer๋ฅผ ๋ก๋ํ์ง ์๊ณ (=Spring์ ์์กดํ์ง ์์) ํ์ํ ๊ฐ์ฒด๋ง ์คํํจ -> ๋งค์ฐ ๋น ๋ฆ!
@Mock, @InjectMocks
- @Mock: ํ ์คํธ์ 'ํ์ํ' ๊ฐ์ง ๊ฐ์ฒด
- @InjectMocks: ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ Mock ๊ฐ์ฒด
@Mock์ผ๋ก ์ ์ธ๋ ๊ฐ์ง ๊ฐ์ฒด๋ค์ ์์กดํ @InjectMocks ๊ฐ์ฒด๋ฅผ ์์ฑ!
given(a(b)).willReturn(c)
๋ฉ์๋๊ฐ ์คํ๋์์ ๋์ ํ ์คํธ๋ฅผ ์ํ ์ํฉ์ ์ค์
- a: Mocking ํ ๋ฉ์๋
- b: ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ
- c: ๋ฉ์๋๋ฅผ ์ํํ์ ๋ ๋ฐํํ๋ค๊ณ ์ค์ ํ ๊ฐ
when.thenReturn VS given.willReturn
when: Mockito๋ฅผ import
given: BDDMockito๋ฅผ import
์ฐจ์ด: BDD ๋ฐฉ์์ ์ฝ๋์ ๋์ ํ ๋, ๊ธฐ์กด์ Mockito๊ฐ ๊ฐ๋ ์ฑ์ ํด์น๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ง ์ด๋ฆ์ด ๋ค๋ฅธ ํด๋์ค!
์ฐธ๊ณ ๋งํฌ
https://dzone.com/articles/writing-your-first-unit-tests
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SpringBoot - Slack Bot ์ฐ๋ํ๊ธฐ (0) | 2022.04.05 |
---|---|
[Error] org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected. (0) | 2022.03.27 |
[22.03.09] QueryDSL (0) | 2022.03.09 |
[22.03.04] Service, Controller ์์ฑ (0) | 2022.03.07 |
[22.03.03] Entity ์์ฑ ๋ฐ Repository ํ ์คํธ (0) | 2022.03.07 |