无法在Spring Boot MVC单元测试中获得HAL格式

时间:2017-05-24 15:34:45

标签: java spring spring-mvc spring-boot spring-hateoas

我正在使用Spring Boot尝试Spring HATEOAS。我小心翼翼地写了一个单元测试:

given().standaloneSetup(new GreetingApi())
        .accept("application/hal+json;charset=UTF-8")
        .when()
        .get("/greeting")
        .prettyPeek()
        .then().statusCode(200)
        .body("content", equalTo("Hello, World"))
        .body("_links.self.href", endsWith("/greeting?name=World"));

测试返回响应如下:

Content-Type: application/hal+json;charset=UTF-8

{
    "content": "Hello, World",
    "links": [
        {
            "rel": "self",
            "href": "http://localhost/greeting?name=World"
        }
    ]
}

但实际上,当我运行整个Spring Boot应用程序时,响应会像这样:

HTTP/1.1 200 
Content-Type: application/hal+json;charset=UTF-8
Date: Wed, 24 May 2017 15:28:39 GMT
Transfer-Encoding: chunked

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/greeting?name=World"
        }
    },
    "content": "Hello, World"
}

所以必须有一些方法来配置HATEOAS的响应,但是我找不到它。

希望熟悉此事的人可以帮助我。

整个存储库为here

1 个答案:

答案 0 :(得分:4)

问题是因为您使用的是standaloneSetup()方法。这意味着您以编程方式构建所有Spring MVC,并且您的测试并不了解所有Spring Boot的“魔法”。因此,此测试具有最小的Spring MVC基础结构,它不知道如何使用HATEOAS。

可能的解决方案是使用Spring Boot准备的WebApplicationContext

@RunWith(SpringRunner.class)
@SpringBootTest
public class GreetingApiTest {

    @Autowired
    private WebApplicationContext context;

    @Test
    public void should_get_a_content_with_self_link() throws Exception {
        given()
            .webAppContextSetup(context)
            .accept("application/hal+json;charset=UTF-8")
        .when()
            .get("/greeting")
            .prettyPeek()
        .then()
            .statusCode(200)
            .body("content", equalTo("Hello, World"))
            .body("_links.self.href", endsWith("/greeting?name=World"));
    }
}