똑같은 삽질은 2번 하지 말자
Mockito(스프링 테스트) 본문
단위테스트를 위한 모듈이다.
<!-- 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