我已经看到类似的问题,但是我还没有找到适合我的解决方案,因此我希望将其发布并提供足够的细节来解决。
所以我有以下课程:
@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.ResponseEntity<com.company.SearchResponse> com.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 = []
即使我尝试搜索的数据在我的本地弹性服务器中不可用(它是),它也应返回带有“ {}”的主体,而不仅仅是空的。所以我对为什么它建立连接并返回状态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 ResponseEntity<SearchResponse> getSearchResults( @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文档。
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc public class ControllerTest { @Autowired private MockMvc mockMvc; @MockBean private SearchService service; @Before public void setUp(){ when(service.someMethod(any())) .thenReturn(SomeResponse); } @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)) .andExpect(status().isOk()) .andDo(mvcResult -> { //Verrify Response here }); } }