【问题标题】:Can not get HAL format in Spring Boot MVC unit test在 Spring Boot MVC 单元测试中无法获取 HAL 格式
【发布时间】:2017-10-25 01:29:39
【问题描述】:

我正在使用 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

【问题讨论】:

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


    【解决方案1】:

    问题是因为您使用的是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"));
        }
    }
    

    【讨论】:

    • 是的,你是对的。我知道集成测试(带有注释 SpringBootTest)确实可以工作,而我真的很想使用独立的方式来加快测试速度。所以我的观点是“必须有一些方法来配置 HATEOAS 的响应”。我正在寻找正确的配置方法。
    • 但也许独立的测试方式并不是 Spring Boot 的最佳实践。如果你认为 SpringBootTest 是正确的方法,你能给我更多的信息吗?谢谢。
    • @aisensiy,如果您想为GreetingApi 控制器创建更多隔离测试,您可以使用 Spring Boot Test 模块中的另一个不错的功能,称为 WebMvcTest。你可以像这样注释你的测试类@WebMvcTest(GreetingApi.class) 在这种情况下,Spring Boot 将只应用与 MVC 测试相关的配置,甚至更多你可以指定具体的控制器类。
    • @aisensiy,您能否详细说明您对测试速度的抱怨?
    • 我尝试了 WebMvcTest 的方式,它可以工作。但我仍然认为手动控制控制器的创建并给出它想要的依赖是单元测试的好方法......对此感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2016-05-28
    • 1970-01-01
    • 2017-02-08
    • 2019-07-04
    • 2020-01-02
    相关资源
    最近更新 更多