简体   繁体   中英

Can't test HTTP status on MockMvc async REST service in spring-test 5.0.3 (works in 5.0.0)

I've generated fresh project using Spring Initializer ( https://start.spring.io/ ) Spring boot - 2.0.0.RC1 which ships spring in version 5.0.3.RELEASE.

Added the following controller:

@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));
    }
}

and having the following dependencies section in build.gradle (problem can be also replicated on 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')
}

The following test fails:

@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());
    }
}

with the following log:

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

It seems that the test sees status code as 200, not 404. The body content is returned properly, though. What's interesting that downgrading to 5.0.0.RELEASE of spring-test - fixes the problem:

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

Is this a spring-test bug?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM