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

Posted by '김용환'

댓글을 달아 주세요