spring boot에서 테스트를 진행하려면, spring-boot-starter-test 를 pom.xml에 추가한다.
testCompile("org.springframework.boot:spring-boot-starter-test")
spring boot start test의 maven pom.xml설정으로 보면 junit, mockito, hamcrest, spring-test가 포함되어 있다. 요즘 많이 사용하고 검증된 lib을 쓸 수 있다.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies>
간단히 mockito로 테스트하는 코드를 작성하는데, 간단한 예제를 소개한다.
GatewayService interface, GatewayServiceImpl class,
GatewayRepository interface, GatewayRepositoryImpl class가 있다.
GatewayServiceImpl 에서 GatewayRepositoryImp 객체를 autowiring 하도록 되어 있다.
@InjectMocks 의 객체 안에 사용 중인 객체를 @Spy 에서 정의된 객체를 Inject할 수 있다. 클래스로 Inject하는 것이니 interface가 아니면 된다.
@RunWith(MockitoJUnitRunner.class)
public class GatewayServiceTest {
@Spy
private GatewayRepository mock = new GatewayRepositoryImpl();
@InjectMocks
private GatewayService service = new GatewayServiceImpl();
@Before
public void before() {
// precondition
ImmutableMap<String, String> data = ImmutableMap.of(
"X", "123");
GatewayRepository mock = mock(GatewayRepository.class);
when(mock.get("8.8.8.8", 500)).thenAnswer(invocation -> data);
}
@Test
public void test() {
Data data = service.get("8.8.8.8");
assertEquals("latitude", data.lat, 1.0, 0);
assertEquals("latitude", data.lng, 2.0, 0);
}
그리고, RestTemplate의 integration test용 TestRestTemplate 클래스를 사용할 수 있다.
private RestTemplate template = new TestRestTemplate();
@Test
public void productionTest() {
String body = template.getForEntity("http://internal.google.com/coord/8.8.8.8", String.class).getBody();
assertThat(body, containsString("latlng"));
}
참고
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html
'general java' 카테고리의 다른 글
[spring mvc] Header에 Http Status로 결과 변경하기 예제 (0) | 2015.09.23 |
---|---|
[spring mvc] restful service 개발시 value 값 오타 조심 (0) | 2015.09.22 |
[zookeeper] java 클라이언트 사용 (0) | 2015.09.01 |
Spring Boot + Gradle + Devtools 사용기 (0) | 2015.09.01 |
Google place api 를 java에서 사용시 유의할 점 (0) | 2015.08.19 |