mock : 모조품이라는 뜻
Mockito는 오픈소스 mock 프레임워크이다.
모조품이라는 뜻과 같이 테스트를 위한 가짜 객체
를 만들어주는 프레임워크이다.
// 이렇게 사용
@RunWith(MockitoJUnitRunner.class)
Mockito가 제공하는 Junit 확장 클래스로써
JUnit4에서 Mockito를 사용하여 테스트 클래스를 실행할 수 있게 해준다
Mock 객체가 주입되어야 하는 필드를 표시하는데 사용한다.
public class MyServiceTest {
@InjectMocks
private MyController myController;
@Mock
private SomethingService somethingService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testMyServiceMethod() {
// 테스트 코드 작성
}
}
MyController 클래스의 객체인 myController에 @InjectMocks이,
SomethingService 클래스의 객체인 somethingService 필드에는
@Mock 애노테이션이 지정되어 있다.
이렇게 함으로써 myController에 객체에는 자동으로 목 객체인 somethingService가 주입되어 테스트를 수행할 수 있게 된다.
때문에 @InjectMocks를 사용하면
public class MyTest {
private MyController myController에; // 주입할 대상 객체
private SomethingService somethingService; // 의존 객체
@Before
public void setup() {
somethingService = new SomethingService(); // 명시적으로 의존 객체 생성
myController에 = new MyController(somethingService); // 의존 객체를 주입하여 MyController 객체 생성
}
@Test
public void testSomeMethod() {
// userService의 메서드를 호출하고 테스트 진행
}
}
이렇게 일일이 의존객체를 주입해 줄 필요가 없다는 것이다.
Mockito 프레임워크에서 사용되며, Mock 객체를 생성하는데 쓰인다.
Mock 객체는 실제 객체와 유사하게 동작하나,
개발자가 직접 제어할 수 있는 "가짜"객체이다.
Mock 어노테이션을 사용하여 Mock 객체를 생성할 수 있다
이렇게 생성된 Mock 객체는 실제 객체의 동작을 흉내낸다.
개발자는 객체의 동작을 원하는 대로 설정할 수 있다.
import org.junit.Before;
import org.junit.Test;
@Mock
// SomethingService라는 클래스를 테스트 하기 위해 somthingService라는 가짜 객체를 만들었다.
SomethingService somthingService;
테스트 메서드임을 알리는 어노테이션
Mock 객체의 동작을 설정하기 위해 사용되는 메서드
특정한 메서드가 호출될 때, 어떤 동작을 하라~ 라고 정의할 수 있다.
단위 테스트시 TEST Stub
을 만들 수 있게 해준다.
* stub : 테스트 대상 모듈에 의해 호출되는 프로그램
1) thenReturn()
Mock 객체의 특정 메서드 호출에 대한 반환 값을 설정하는데 사용한다.
이때, 반환 값은 특정 메서드가 return하는 값의 형식과 일치해야 한다.
@TEST
public void 테스트_메서드() throws Exception {
/* somthingService의 selectSomeList()라는 메서드는
return pageInfo를 반환한다고 가정하자*/
PageInfo pageInfo = new PageInfo();
Mockito.when(somthingService.selectSomeList()).thenReturn(pageInfo);
/* 이런 식으로 thenReturn에는 selectSomeList() 라는
해당 메서드의 반환형식과 일치하도록 하여
테스트 메서드에서의 반환 값을 결정할 수 있다.
다른 형식은 안됨.
*/
}
2) thenAnswer()
3)
개인적으로 이걸 왜 쓰지 했는데 챗지피티가 잘 말해줘서
인상깊었던 이유 2개 들고와 봤다.
1) 의도한 테스트 시나리오 정의: 목 객체를 사용하여 실제 코드와의 상호작용을 시뮬레이션할 때, 특정 메서드 호출에 대한 반환 값을 설정하여 특정 상황에서 어떻게 동작해야 하는지 명확하게 정의할 수 있습니다.
2) 의존성 관리: 테스트 대상 클래스가 다른 클래스나 서비스와 의존성을 갖는 경우, 이러한 의존성을 목 객체로 대체하여 테스트를 단순화할 수 있습니다. 이 때 when() 메서드를 사용하여 의존하는 메서드 호출에 대한 반환 값을 제어할 수 있습니다.
Mock 객체의 메서드가 특정한 방식으로 호출되었는지를 검증할 수 있다.
// 기본적인 사용법..
verify(mockObject, verificationMode).methodCall();
@TEST
public void 테스트_메서드() throws Exception {
PageInfo pageInfo = new PageInfo();
Mockito.when(somthingService.selectSomeList()).thenReturn(pageInfo);
//Mockito.times(n) : Mock 객체의 특정 메서드(selectSomeList) 호출이 n만큼 이루어 졌는가를 확인
Mockito.verify(somthingService, Mockito.times(1)).selectSomeList();
// => somthingService라는 Mock객체에서 selectSomeList라는 메서드가 1번 호출이 되었는가
}
JAVA용 단위 테스트 프레임워크
해당 테스트 클래스를 실행할 때 사용할 테스트 실행기를 지정하는 데에 사용됨
나는 @RunWith(MockitoJUnitRunner.class)를 사용했지만
상황에 따라 () 괄호 안에 다른 실행기가 들어갈 수 있음
Junit 프레임워크에서 사용되는 어노테이션
테스트 메서드가 실행되기 전에 실행할 메서드를 지정할 때 사용한다.
이 메서드는 테스트 메서드가 실행되기 전에 반드시 1번 실행된다.
테스트 전 초기화 작업으르 위해 사용
import org.junit.Before;
import org.junit.Test;
@Mock
SomethingService somthingService;
@Before
public void setup() {
// 위에 선언한 mock 객체(somthingService)로 mock 객체 초기화
MockitoAnnotaions.initMocks(this);
}