테스트

Mockito

소밍소밍 2022. 3. 14. 00:28

Maven Dependency

버전의 경우 2.x 버전이 나오면서 BDD라는 개발방법이 추가되었는데 1.x로도 충분히 쓸 수 있다고 함

<dependency>
	<groupId>org.mockito</groupId>
	<artifactId>mockito-all</artifactId>
	<version>1.10.19</version>
	<scope>test</scope>
</dependency>

기본 사용법

thenReturn

원하는 값을 리턴하는 것. 이런 방식으로 사용하는데, 이 경우는 id가 1인 경우에만 의도대로 동작하게 된다. 그러나 이렇게 각 id별로 모두 통제할 수는 없기 때문에 생겨난 것이 any~로 시작하는 matchers이다.

UserDao dao = mock ( UserDao.class );
when ( dao.findById ( 1 ) ) . thenReturn ( testUser );

matchers

사용 방법은 예시와 같고, 세부적으로는 anyInt(), anyString(), anyDouble(), anyLong(), anyList(), anyMap()과 같은 방식들을 지원한다.

UserDao dao = mock ( UserDao.class );
when ( dao.findById ( ) ) . thenReturn ( testUser );

thenThrow

예시는 thenReturn이었고 이번에는 thenThrow로 exception발생시 던져버리는 것이다!

UserDao dao = mock ( UserDao.class );
when ( dao.findById ( ) ) . thenThrow ( new RuntimeException ( "invalid..." ).... ;

verify

호출 횟수 검사, 쉽게 말하자면 몇번 불렸는지 확인하는 것이다! 위 예시에서는 dao . findById ( anyInt ( ) ); 부분이 딱 3번 실행되었는지 확인하는 것이다. 확인하는 조건으로는 위의 times(int) 이외에도 never(), atLeastOnce(), atLeast(int), atMost(int)가 있다. 상황에 맞게 사용하면 된다.

verify ( dao , times ( 3 ) ) . findById ( anyInt ( ) );

spy

특정 메소드만 조작하기 위해서 앞의 mock의 경우 .class로 사용한 것과 다르게 new를 사용한다. mock은 재현시키는 것 이외에는 아무것도 하지 않고 그냥 넘어간다. 그렇지만 실제 사용할 일은 잘 없다고 한다.

agent = spy ( new HttpClientAgent ( ) );
when ( agent . callUrl ( " " ) ) . thenReturn ( true );

@Mock, @InjectMocks

Mock 메소드 대신 annotation 활용 가능하다. RunWith부분은 annotation 사용하기 위해 필요한 

import org.junit.runner.RunWith;
import org.mockito.Mock;

@RunWith (MockitoJUnit44Runner.class)
public class UserServiceTest {

	@Mock
	UserRepository repository;
    
	@InjectMocks
	UserService service;
    
	....

 

 

 

'테스트' 카테고리의 다른 글

Mock Test 중 cannot subclass final class class ...  (0) 2022.03.15
이클립스에서 Eclemma 쓰기  (0) 2022.03.14
테스트 대역 (Test Doubles)  (0) 2022.03.14
이클립스에서 JUnit4 사용하기  (0) 2022.03.14
JUnit4  (0) 2022.03.14