CH02 Mockito
Mockito μ λν μ§κΈμ μκ°(κ²°λ‘ : μ΅λν μ°μ§ λ§μ)
μ΄ κ°μ μ체λ₯Ό κ½€ μμ μ λ€μλ κ²μ΄κ³ , μλ λ ΈνΈλ κ·Έ λ μ 리νλ κ²μ΄λ€. λΉμμλ ν μ€νΈλ₯Ό ν λ νμν λΆλΆμμ mock κ°μ²΄ λ±μ νμ©ν΄μ ν μ€νΈλ₯Ό λ μ½κ² ν μ μμ΄μ μ’λ€κ³ μκ°νλλ° μ¬μ€ μ§κΈμ μκ°μ΄ μ’ λ°λμλ€.
mock μ μ΄μ©ν΄μ μ΄λ ν κ°μ²΄μ νλμ μ‘°μνλ€λ κ² μμ²΄κ° μ‘°μ λΉμ©μ΄ λ무 ν° μΌμ΄λ€. λκ°κ° λ°λλ©΄ μ΄ μ‘°μκΉμ§ λͺ¨λ λ°κΏμ€μΌνλλ°, μ‘°μμ΄ ν΄ μλ‘ μμ λΉμ©μ΄ λ§€μ° ν¬λ€. λ΄κ° μ§λ , λ€λ₯Έ μ¬λμ΄ μ§λμ μ½λλ ν μ€νΈ νκ³ μ νλ λͺ¨λ νΉμ λ©μλκ° νΌμΉ λͺ»νκ² κ½€ λ§μ μΌλ€μ νλλ‘ μ²λ¦¬ν΄ λ κ²½μ°μ μ΄λ€ μλλ ν μ€νΈλ₯Ό μν΄μ μ€κ°μ μ‘°μμ ν κ² λ무 λ§λ€.
κ·Έλ°λ° λ΄κ° λ§νκ³ μ νλ κ²μ λͺ¨νΉ μμ²΄κ° μμ λΉμ©μ΄ ν¬λκΉ μμ’λ€λ μ΄μΌκΈ°λ₯Ό νλ €λ κ²μ΄ μλκ³ μ μ΄μ λͺ¨νΉμ λ§μ΄ ν΄μΌν μ λλ‘ ν μ€νΈ λ¨μκ° μ»€μλ μλκ³ , κ·Έλ¬κΈ° μν΄μλ μ€κ³μ κ°μ²΄μ μ± μκ³Ό μν λ²μκ° μ΅λν μμμΌνλ€λ κ²μ΄λ€.
κ°μ²΄μ νλ ₯ ꡬ쑰λ₯Ό μ΅λν μͺΌκ°μ μ€κ³λ₯Ό ν΄λλ©΄ λκ° νΉμ λ¨μμ ν μ€νΈλ₯Ό ν λ νμν μ‘°μ νμκ° λ§€μ° μ μ΄μ§κ±°λ μμ νμκ° μμ΄μ§λ€. κ·Έλ¦¬κ³ Mockito λ₯Ό μ¬μ©νμ§ μκ³ ν μ€νΈ μ€μ½νμμ DIP λ₯Ό μ μ©ν μλ μλ€. κ·Έλ κ² μ€κ³λ₯Ό μ ν΄λλ©΄ λλ€.
μμΌλ‘ λ§μ£ΌμΉ κΈ°μ‘΄ λ κ±°μ νλ‘μ νΈ νΉμ λ΄κ° λ§λλ μλ‘μ΄ νλ‘μ νΈ λͺ¨λ μ΄λ»κ² λ μ§λ λͺ¨λ₯΄κ² κ³ , λ΄ μκ°λ μ΄λ»κ² λ°λμ§ λͺ¨λ₯΄κ² μ§λ§ μ§κΈμΌλ‘μλ Mockito μ체λ₯Ό κ·Έλ₯ μΈ μΌμ΄ μκ²λ μ€κ³λΆν° μ΅λν μ κ²½μ°μλ κ²μ΄ μ§κΈμ λμ μκ°μ΄λ€.
Mockito μκ°
mock
mock λ¨μ΄ μμ²΄κ° 'κ°μ§μ' μ κ°μ λ»μ κ°μ§κ³ μλ€. ν μ€νΈμμ 'λͺ© κ°μ²΄' μ κ°μ λ¨μ΄λ‘ μμ£Ό μ¬μ©λλ κ°λ μ΄λ€. ν μ€νΈλ₯Ό μν λλ―Έμ κ°λ μ΄λ€.
곡μ ννμ΄μ§ μκ° κ·Έλλ‘λ₯Ό μΈμ©νλ€.
Tasty mocking framework for unit tests in Java
Mock κ°μ²΄ λ§λλ λ°©λ²
Mockito.mock() λ©μλλ‘ λ§λλ λ°©λ²
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
@Mock μ λ
Έν
μ΄μ
μΌλ‘ λ§λλ λ°©λ²
JUnit 5 extensionμΌλ‘ MockitoExtensionμ μ¬μ©ν΄μΌ νλ€.
λ©μλ λ§€κ°λ³μμμ μ μΈνμ¬λ λκ³ ν΄λμ€μ λ©€λ² νλλ‘λ μ μΈνμ¬ μ¬μ©μ΄ κ°λ₯νλ€.
@ExtendWith(MockitoExtension.class)
class SocialLoginServiceTest {
// @Mock SocialLoginService socialLoginService <- ν΄λμ€μ λ©€λ² νλλ‘λ κ°λ₯
@DisplayName("μ΄λ
Έν
μ΄μ
μ μ΄μ©ν mock κ°μ²΄ μμ± ν
μ€νΈ")
@Test
void createSocialLoginWithAnnotation(@Mock SocialLoginService socialLoginService) {
assertNotNull(socialLoginService);
}
}
Mock κ°μ²΄ μ‘°μνκΈ°
μΈν°νμ΄μ€μ κ°μ΄ λ€νμ±μ μν΄μ μΆμνλ ν΄λμ€λ₯Ό ν μ€νΈμμ μ¬μ©ν΄μΌ ν κ²½μ°κ° μλ€. λΏλ§ μλλΌ μΈλΆ apiμ μ°λν΄μΌ ν κ²½μ°, μνλ κ²°κ³Όκ°μ μμ μ΄ λμλ€κ³ κ°μ νκ³ κ·Έ λ€μμ νλλ€μ νλμ μ λμΌλ‘ λ³΄κ³ μ΄λ₯Ό ν μ€νΈ ν λ, κ°μ μ λλ‘ λ°μλ€κ³ κ°μ ν΄μΌ ν νμκ° μλ€. μ΄λ΄ λ, Mockκ°μ²΄λ₯Ό μ‘°μνλ©΄ μνλ ν μ€νΈ μλ리μ€λλ‘ μ λ ν μ€νΈλ₯Ό νκΈ°κ° μ©μ΄ν΄μ§λ€.
@DisplayName("social login μ μΈλΆ apiν΅ν ν ν° μμ ")
@Test
void socialLoginGetToken(@Mock SocialLoginService socialLoginService) {
String token = "userToken";
Mockito.when(socialLoginService.getToken()).thenReturn(token);
assertEquals(token, socialLoginService.getToken());
}
μ리λ Mockito.when~ μμ μ μ ν΄λλλ‘ κ²°κ³Όκ°μ΄ 미리 μΈν μ΄λκ³ μ€μ λ‘ ν΄λΉ μ½λκ° μ€νμ΄ λμ§λ§ κ²°κ³Όκ°μ 미리 μΈν λ κ²°κ³Όκ°μ λ°λλ‘ νλ κ²μ΄λ€. μ¦, μ€μ λ‘ socialLoginServiceμ getToken()κ° μ€νμ΄ λκΈ΄ νλλ° κ·Έκ²μ κ²°κ³Όκ°μΌλ‘ 미리 μ μν΄λ String token = βuserTokenβ; κ°μ return λ°κ² λλ κ²μ΄λ€.
μ΄λ λ― λ―Έλ¦¬ μ μν μ½μλλ‘ λ€μ΄μ¬ κ²½μ° λ―Έλ¦¬ μ μν κ°μ return νλ λ°©μμ΄κΈ° λλ¬Έμ, νλΌλ―Έν°κ° μ¬μ μ μ μνμ§ μμ λ€λ₯Έ κ²μ΄ μ€λ©΄ μ€μ λ‘ λ‘μ§λλ‘ μ²λ¦¬ν κ²°κ³Όκ° return λλ€. λ§μ½ νλΌλ―Έν°μ κ·μλμ§ μκ³ mock κ°μ²΄λ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ μλμ κ°μ΄ any()λ₯Ό μ¬μ©νλ©΄ λλ€.
μΆκ°λ‘, doThrow()λ₯Ό μ΄μ©νλ©΄ 미리 μ μν κ°μ return λ°λ κ²μ΄ μλλΌ λ―Έλ¦¬ μ μν μλ¬κ° λ°μνκ²λ mock κ°μ²΄λ₯Ό νμ©ν μλ μλ€.
doThrow(new RuntimeException()).when(mockedList).clear();
μλλ mokitoμ ArgumentMatchers κ° κ°μ§ any()λ₯Ό ν΅ν΄μ λ νΈνκ² ν μ€νΈκ° κ°λ₯νλ€.
@DisplayName("social login μ μΈλΆ apiν΅ν ν ν° μμ ")
@Test
void socialLoginGetToken(@Mock SocialLoginService socialLoginService) {
String token = "userToken";
Mockito.when(socialLoginService.getToken(any())).thenReturn(token);
Object userInfo = new Object();
assertEquals(token, socialLoginService.getToken(userInfo));
assertEquals(token, socialLoginService.getToken("anything"));
}
BDD μ€νμΌ Mockito API
BDD μ€νμΌλ‘ Mokitoλ₯Ό μ¬μ©ν μ μλ€. BDDμ κΈ°λ³Έ μ² νμ κ°λ°μμ λΉκ°λ°μκ°μ collaboration μ μ κ·Ή μμνλ€λ κ²μΈλ° μ΄ν리μΌμ΄μ μ βνλβμ μν΅μ κΈ°μ€μΌλ‘ μΌλλ€. μ¦, βμ΄ν리μΌμ΄μ μ΄ μ΄λ»κ² νλν΄μΌ νλ€β λΌλ μΈ‘λ©΄μμ μ¬λ¬κ°μ§λ₯Ό κ·μ ν μ μκ³ μ΄ βνλβμ λ°νμΌλ‘ νμ¬ νΉμ κ°λ°μ€μΈ μ΄ν리μΌμ΄μ μ΄ μ μ νκ² βνλβνκ³ μλμ§λ₯Ό λ Όμν μ μλ κ²μ΄λ€.
κ·Έλμ BDDμ μ κ°νμ¬ μ΄ν리μΌμ΄μ μ νλμ κ·μ ν λ βμ΄λ€ μν©μμ, μ΄λ€ κ²½μ°μ, μ΄λ κ² νλν΄μΌνλ€β λΌκ³ μ΄ν리μΌμ΄μ μ νλμ κΈ°λν μ μλ€. κ·Έλ¦¬κ³ μ΄λ¬ν κΈ°λλ₯Ό Mokitoλ₯Ό μ΄μ©ν΄μ μ½λλ‘ νννμλ©΄ λνμ μΈ BDD ν¬λ§·μΌλ‘ given, when, then μ μ¬μ©ν μ μλ€. μλλ κ·Έ μμμ΄λ€.
given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);
μλλ κ°μ μμ€μμ μ¬μ©λ given, when, then μμμ΄λ€.
@Test
void createNewStudy() {
System.out.println("========");
System.out.println(port);
// Given
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
Member member = new Member();
member.setId(1L);
member.setEmail("keesun@email.com");
Study study = new Study(10, "ν
μ€νΈ");
given(memberService.findById(1L)).willReturn(Optional.of(member));
// When
studyService.createNewStudy(1L, study);
// Then
assertEquals(1L, study.getOwnerId());
then(memberService).should(times(1)).notify(study);
then(memberService).shouldHaveNoMoreInteractions();
}
Last updated