【问题标题】:Can't test HTTP status on MockMvc async REST service in spring-test 5.0.3 (works in 5.0.0)无法在 spring-test 5.0.3 中测试 MockMvc 异步 REST 服务上的 HTTP 状态(适用于 5.0.0)
【发布时间】:2018-02-13 14:56:13
【问题描述】:

我使用 Spring Initializer (https://start.spring.io/) 生成了新项目 Spring boot - 2.0.0.RC1,在版本 5.0.3.RELEASE 中提供 spring。

添加了以下控制器:

@RestController
@ResponseBody
@RequestMapping(value = "/customer")
public class CustomerController {
    @GetMapping("/")
    public Future<ResponseEntity<String>> get1() {
        return CompletableFuture.supplyAsync(() -> new ResponseEntity<String ("not found", HttpStatus.NOT_FOUND));
    }
}

并且在 build.gradle 中有以下依赖部分(问题也可以在 maven build 上复制)

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework:spring-web')
    testCompile('org.springframework:spring-test')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

以下测试失败:

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class CustomerControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test404() throws Exception {
        MvcResult asyncResult = mockMvc.perform(MockMvcRequestBuilders.get("/customer/"))
                .andExpect(request().asyncStarted())
                .andReturn();

        mockMvc.perform(asyncDispatch(asyncResult))
                .andExpect(status().isNotFound());
    }
}

使用以下日志:

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /customer/
       Parameters = {}
          Headers = {}
             Body = null
    Session Attrs = {}

Handler:
             Type = com.example.wkicior.demo.CustomerController
           Method = public java.util.concurrent.Future<org.springframework.http.ResponseEntity<java.lang.String>> com.example.wkicior.demo.CustomerController.get1()

Async:
    Async started = true
     Async result = <404 Not Found,not found,{}>

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /customer/
       Parameters = {}
          Headers = {}
             Body = null
    Session Attrs = {}

Handler:
             Type = com.example.wkicior.demo.CustomerController
           Method = public java.util.concurrent.Future<org.springframework.http.ResponseEntity<java.lang.String>> com.example.wkicior.demo.CustomerController.get1()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[text/plain;charset=UTF-8], Content-Length=[9]}
     Content type = text/plain;charset=UTF-8
             Body = not found
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

java.lang.AssertionError: Status 
Expected :404
Actual   :200

似乎测试将状态代码视为 200,而不是 404。不过,正文内容已正确返回。 有趣的是,降级到 spring-test 的 5.0.0.RELEASE - 解决了这个问题:

testCompile('org.springframework:spring-test:5.0.0.RELEASE')

这是一个弹簧测试错误吗?

【问题讨论】:

    标签: java spring spring-test


    【解决方案1】:

    看起来确实像弹簧虫:https://jira.spring.io/browse/SPR-16430 移至 5.0.4.BUILD-SNAPSHOT 解决了问题

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2017-04-29
      • 2019-04-04
      相关资源
      最近更新 更多