Spring Boot集成测试以空响应体响应 - MockMvc
Spring Boot集成测试以空响应体响应 - MockMvc
我看到了类似的问题,但是我还没有找到适合我的解决方案,所以我希望通过提供足够的细节来解决这个问题。
所以我有以下的类:
@RunWith(SpringRunner.class) @SpringBootTest public class TestController { @Mock private Controller controller; private MockMvc mockMvc; @InjectMocks private SearchService service; @Before public void setUp(){ MockitoAnnotations.initMocks(this); this.mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new GlobalExceptionHandler()).build(); } @Test public void getSearchResults() throws Exception{ this.mockMvc.perform(post("/something/search").header("header1","1").header("header2","2") .content("MY VALID JSON REQUEST HERE") .contentType(MediaType.APPLICATION_JSON)).andDo(print()); } }
上述代码打印结果如下:
MockHttpServletRequest: HTTP Method = POST Request URI = /something/search Parameters = {} Headers = {Content-Type=[application/json], header1=[1], header2=[2]} Handler: Type = com.company.controller.Controller Method = public org.springframework.http.ResponseEntitycom.company.controller.Controller.getSearchResults(com.company.SearchRequest,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) throws java.io.IOException 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 = null Body = Forwarded URL = null Redirected URL = null Cookies = []
即使我要搜索的数据在我的本地弹性服务器中不可用(实际上是可用的),它应该返回带有“{}”的body而不是为空。所以我对它为什么会建立连接并返回状态码200有点困惑。
这是我的控制器类:
@CrossOrigin @RestController @RequestMapping(value = "/something") @Api("search") @Path("/something") @Produces({"application/json"}) @Consumes({"application/json"}) public class Controller { @Autowired private SearchService searchService; @POST @PATH("/search") @Consumes({"application/json"}) @Produces({"application/json"}) @RequestMapping(value = "/search", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes MediaType.APPLICATION_JSON_VALUE) public ResponseEntitygetSearchResults( @ApiParam(value = "json string with required data", required = true) @Valid @RequestBody SearchRequest request, @RequestHeader(required = true) @ApiParam(value = "header1", required = true) @HeaderParam("header1") String header1, @RequestHeader(required = true) @ApiParam(value = "header2", required = true) @HeaderParam("header2") String header2 ) throws IOException { //some logic return new ResponseEntity(Object, HttpStatus.OK); } }
此外,如果我在请求中提供了一些不正确的值(仍然是正确的json),我会收到有效的错误响应。有点奇怪。
感谢帮助的任何人!:/
Spring Boot中的集成测试中,当使用MockMvc进行测试时,可能会出现响应为空的问题。出现这个问题的原因是在测试中没有正确地模拟被调用的方法。
解决这个问题的方法是使用Mockito框架提供的Answers.CALLS_REAL_METHODS功能。通过设置这个功能,可以让被调用的方法真正地执行,而不是被模拟掉。
具体的解决方法如下:
(answer = Answers.CALLS_REAL_METHODS) private SearchService service;
通过上述代码,可以将service对象设置为使用CALLS_REAL_METHODS功能,在测试中调用service方法时,会真正地执行这些方法,而不是返回模拟的结果。这样可以确保测试的准确性,并避免响应为空的问题。
,解决Spring Boot集成测试中响应为空的问题的方法是使用Mockito框架的Answers.CALLS_REAL_METHODS功能,通过设置这个功能,可以让被调用的方法真正地执行,避免返回空的结果。
问题的原因是测试中的MockMvc无法正确响应请求并返回空的响应体。这可能是由于未正确设置MockMvc或模拟服务的原因。
解决方法是更改测试中的thenReturn方法为thenCallRealMethod方法,以便调用实际的方法。这可能会解决问题并正确地返回响应。
下面是完整的解决方法:
首先,确保在测试类中导入所需的类,包括SpringRunner、SpringBootTest、MockMvc和MediaType。
然后,在测试类中创建一个私有的MockMvc实例和一个模拟的SearchService实例。
在setUp方法中,使用Mockito的when方法来模拟SearchService的someMethod方法,并返回预期的响应。
在getSearchResults方法中,使用this.mockMvc.perform方法来执行POST请求。在请求中,设置请求的路径、标头和内容,并指定请求的内容类型为APPLICATION_JSON。
然后,使用andExpect方法来验证请求的状态码是否为200。
最后,使用andDo方法来执行自定义操作。在这个例子中,我们可以在mvcResult对象中验证响应。
这样,我们就完成了对Controller的集成测试,并验证了响应是否符合预期。
希望这篇文章对你有帮助!