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.