똑같은 삽질은 2번 하지 말자

Mockito(스프링 테스트) 본문

Spring

Mockito(스프링 테스트)

곽빵 2019. 11. 17. 13:59

단위테스트를 위한 모듈이다.

 

<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>1.10.19</version>
		</dependency>
		<dependency>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-core</artifactId>
			<version>1.3</version>
		</dependency>

 

우선 스프링이 제공하는 MessageSource 인터페이스를 이용해 외부에서 메시지를 가죠오는 구현 클래스를 테스트

 

import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;

@Service
public class MessageService {
	@Autowired
	MessageSource messageSource;
	public String getMessageByCode(String code) {
		return messageSource.getMessage(code,null,Locale.getDefault());
	}
}

실제 운영 환경이라면 MessageSource에 ResourceBundleMessageSource를 사용해 외부에 정의된 메시지를 

가져오는 것이 정상이지만, 단위 테스트 환경에서는 의존 컴포넌트인 MessageSource를 모의화(Mocked)해서 테스트

해보자. 의존 컴포넌트를 모의화하면 테스트 조건을 쉽게 만들 수 있어서 테스트 코드를 효율적으로 기술할 수 있다.

BUT 지금 작성한 코드의 내용은 너무 단순해서 모의화를 왜하지? 라는 생각이 들 수 있지만, 

의존 컴포넌트의 반환값에 따라 복잡한 분기 처리를 하는 경우라면 의존 컴포넌트에서 반환값을 자유롭게 제어

할 수 있는 목 구조가 상당히 유용하게 활용될 수 있다.

import static org.junit.Assert.*;
import static org.hamcrest.core.Is.*;
import static org.mockito.Mockito.*;

import java.util.Locale;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.context.MessageSource;

@RunWith(MockitoJUnitRunner.class)
public class MessageServiceTest {
	@InjectMocks
	MessageService service;

	@Mock
	MessageSource mockMessageSource;

	@Test
	public void testGetMessageByCode() {
		// MessageSource의 목을 설정한다. 여기서는 'greeting 이라는 코드가 지정될때, Hello 를 반환하게 한다.
		// 객체의 행위를 내가 임의로 설정함으로써 테스트의 유연함을 얻을수 있다.
		doReturn("Hello!!").when(mockMessageSource) 
		.getMessage("gretting", null, Locale.getDefault());
		// 테스트를 한다.
		String actualMessage = service.getMessageByCode("gretting");
		System.out.println(actualMessage);
		assertThat(actualMessage, is("Hello!!"));
	}

}

 

간단한 테스트코드 MessageSource 라는 객체를 내가 맘대로 조종하는 것.

 

 

'Spring' 카테고리의 다른 글

스프링 시큐리티  (0) 2019.11.18
DI 컨테이너에서 관리되는 빈에 대한 통합 테스트  (0) 2019.11.17
스프링 테스트  (0) 2019.11.17
@Validation  (0) 2019.11.14
Proxy 패턴  (0) 2019.11.13
Comments