春季启动测试:@get请求返回的正文为null

时间:2019-07-29 12:01:44

标签: rest spring-boot spring-boot-test content-negotiation

在进行内容协商测试模拟时,尽管响应状态为200,但GET响应主体中的返回值为null。

java.lang.AssertionError: Response header 'Content-Type' 
Expected :application/json;charset=UTF-8
Actual   :null

这里是完整的测试类代码。我想确认内容类型为json。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class ControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    Controller controller;

    @Test
    public void test() throws Exception {
        mockMvc.perform(get("/query?mediaType=json"))
                .andExpect(status().isOk())
                .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE));
    }}

这是我控制器的端点。

    @RestController
    public class Controller {

        @RequestMapping(value = "/query", produces = {"application/json", "application/xml"}, method = RequestMethod.GET)
        public @ResponseBody ResultSet getResults(
                final HttpServletRequest request
        ) throws Throwable {

       // logic  ...
       SearchService search = (SearchService) context.getBean("search");
       ResultSet result = search.getResults();
       return result;
    }

有什么想法为什么Body会返回null?

1 个答案:

答案 0 :(得分:1)

问题出在Test类中的Controller定义上。在测试Controller时,应使用其实际实例。如下获得该mockMvc的{​​{1}}实例(您可以在带有注释的Controller设置方法中进行操作)

@Before