미운 오리 새끼의 우아한 개발자되기

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @JsonTest 본문

Spring & Spring Boot/Spring Boot

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @JsonTest

Serina_Heo 2022. 9. 27. 11:06

스프링부트는 애플리케이션 테스트 슬라이스를 위한 여러가지 애노테이션을 제공한다.

 

@JsonTest

JSON 직렬화/역직렬화 테스트를 위한 설정만을 활성화할 수 있다.

package demo.user;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.asserThat;

@RunWith(SpringRunner.class)
@JsonTest
public class UserTests {
    
    private User user;
    
    // Jackson 에서 제공하는 AssertJ 기반의 JSON 테스터를 주입받는다.
    @Autowired
    private JaksonTester<User> json;
    
    @Before
    public void setup() throws Exception {
        User user = new User("user", "Jack", "Frost", "jfrost@example.com");
        user.setId(0L);
        user.setCreatedAt(12345L);
        user.setLastModified(12346L);
        this.user = user;
    }
    
    @Test
    public void deserializeJson() throws Exception {
        String content = "{\"username\": \"user\", \"fristName\": \"Jack\", "
        + "\"lastName\": \"Frost\", \"email\": \"jfrost@example.com\"}";
        assertThat(this.json.parse(content))
        	.isEqualTo(new User("user", "Jack", "Frost", "jfrost@example.com"));
        assertThat(this.json.parseObject(content).getUsername())
        	.isEqualTo("user");
    }
    
    @Test
    public void serializeJson() throws Exception {
        // User 객체를 JSON 으로 반환하고 user.json 파일과 비교한다
        assertThat(this.json.write(user)).isEqualTo("user.json");
        assertThat(this.json.write(user)).isEqualToJson("user.json");
        assertThat(this.json.write(user)).hasJsonPathStringValue("@.username");
        
        // 실제 JSON 결과가 예상한 속성값과 일치하는지 판정한다
        assertJsonPropertyEquals("@.username", "user");
        assertJsonPropertyEquals("@.firstName", "Jack");
        assertJsonPropertyEquals("@.lastName", "Frost");
        assertJsonPropertyEquals("@.email", "jfrost@example.com");
    }
 	
    private void assertJsonPropertyEquals(String key, String value) throws java.io.IOException {
        assertThat(this.json.write(user)).extractJsonPathsStringValue(key).isEqualTo(value);
    }
}

실제 JSON 직렬화 결과가 테스트 메소드에 의해 실행되는 예상 결과와 일치하는지 판정할 수 있는 방법은 여러가지가 있다.

classpath에 있는 JSON 파일을 테스트 자원으로 매핑해서 테스트 메소드가 종료되고 정리될 때까지 사용할 수 있는데, 속성값이 아주 많을 때는 특히 유용하다. 그렇지 않으면 deserializeJson() 메소드에 작성된 것처럼 너저분하게 JSON 문자열을 하드코딩해서 비교하고 판정할 수도 있다.

src/test/resource 아래에 user.json 파일은 아래와 같다.

{
    "username": "user",
    "firstName": "Jack",
    "lastName": "Frost",
    "email": "jfrost@example.com",
    "createdAt": 12345,
    "lastModified": 12346,
    "id": 0
}

 

[Reference] Cloud Native Java - Josh Long, Kenny Bastani, 책만