Mockito
Mock을 지원하는 프레임워크로 Mock 객체를 만들고 관리하고 검증 할 수 있는 방법 제공합니다. 쉽게 가짜 객체를 만들어준다고 생각하면 됩니다. 구현체가 아직 없는 경우나, 구현체가 있더라도 특정 단위만 테스트 하고 싶을 경우 주로 사용하게 됩니다.
Mock이란
한글로 "모의, 가짜의" 라는 뜻으로 테스트할 때 필요한 실제 객체와 동일한 모의 객체를 만들어 테스트의 효용성을 높이기 위해 사용하는 것을 말합니다.
🏷️ Mock 객체 만드는 법
✅ Mockito.mock(만들고자 하는 객체 타입.class)
public class ListTest {
@Test
void simpleTest() {
List listMock = mock(List.class);
when(listMock.size()).thenReturn(3);
assertEquals(3, listMock.size());
}
}
✅ @Mock 어노테이션
@ExtendWith(MockitoExtension.class)
class SomeBusinessImplMockTest {
@Mock
private DataService dataServiceMock;
@InjectMocks
private SomeBusinessImpl businessImpl;
// 생략
}
클래스에 @ExtendWith(MockitoExtension.class)를 붙여주고 멤버변수에 @Mock을 붙여주어야 합니다. 또한 아래 처럼 파라미터로 넘길 수 있습니다.
@Test
void test(@Mock MemberService memberService, @Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
}
@Mock: mock 객체를 만들어서 반환합니다.
@InjectMocks: @Mock이나 @Spy 객체를 자신의 멤버 클래스와 일치하면 주입시킵니다.
🏷️ Mock 객체 행동 관리
Mock 객체를 만들었으면 테스트 할 행동이 어떻게 진행될 것인지에 대해 가정이 필요합니다. 이때 Mock객체의 행동을 조작하는 것을 Stubbing 이라고 합니다.
즉, 특정한 매개변수를 받았을 때, 특정한 값을 리턴하거나 예외를 던지도록 설정할 수 있으며 void 메소드 호출시 예외를 던질 수 있습니다. 또한 동일한 메소드가 여러번 호출될 때, 각각 다르게 행동하도록 할 수 있습니다.
// 사용된 class
public class SomeBusinessImpl {
private DataService dataService;
public SomeBusinessImpl(DataService dataService) {
this.dataService = dataService;
}
public int findTheGreatestFromAllDate() {
int[] data = dataService.retrieveAllDate();
int greateValue = Integer.MIN_VALUE;
for(int value : data) {
if(value > greateValue) {
greateValue = value;
}
}
return greateValue;
}
}
interface DataService {
int[] retrieveAllDate();
}
@Test
void findTheGreatestFromAllDate_basicScenario() {25, 15, 5}{
// 위의 retrieveAllDate() 메서드가 호출될 {25, 15, 5} 값을 리턴
when(dataService.retrieveAllDate()).thenReturn(new int[] {25, 15, 5});
assertEquals(25, businessImpl.findTheGreatestFromAllDate());
}
// .thenReturn()이나 .thenThrow()를 이어 붙여서 사용합니다.
when()
Mockito 라이브러리에서 제공하는 메서드로, 모의 객체(Mock)를 사용할 때 해당 객체의 메서드가 특정한 매개변수로 호출될 때 어떤 값을 반환하도록 설정하는 데 사용됩니다.
📖 Reference
'코딩 공부 > web & Java' 카테고리의 다른 글
[Spring] AOP (1) | 2024.01.05 |
---|---|
[Java] 테스트 더블(Test Double) (feat. Mock, Stub) (1) | 2023.12.16 |
[Java] JUnit (0) | 2023.12.12 |
[Web] JWT (1) | 2023.12.08 |
[Spring/Web] CSRF (1) | 2023.12.04 |