Java Junit测试HTTP POST请求不起作用。
Java Junit测试HTTP POST请求不起作用。
我正在尝试为我的API添加集成测试,我已经通过Postman测试了所有的GET/POST/PUT方法,它们都可以正常工作,但是我无法在JUnit和Mockito上使它们正常工作,有什么想法吗?
@SpringBootTest @AutoConfigureMockMvc public class ResponseStatusControllerIntegrationTest { @Autowired private MockMvc mockMvc; private String content; @BeforeEach public void setup() { this.mockMvc = MockMvcBuilders.standaloneSetup(new NsaController()) .build(); try(FileInputStream inputStream = new FileInputStream("\\java\\resources\\post.json")) { content = IOUtils.toString(inputStream); }catch (Exception e){ e.printStackTrace(); } } @Test public void endpointTest() throws Exception { this.mockMvc.perform(post("/api/v1/nsascholarship",content) .contentType(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk());} }
代码应该将JSON数据,并将其发布到H2数据库,但是根据我如何提供JSON对象(在一个字符串中),我会遇到:
状态应该:<200>,但实际上是:<400>(当提供的数据缺少应有数据时,可能会返回400)
我猜测出现问题的原因是我可能没有正确地提供JSON内容,使得虽然方法无法将其添加到数据库中。
总之,Post请求在Postman上可以工作,但在JUnit却不能正常工作,我认为问题出在测试方法没有正确地提供JSON内容上,有什么想法吗?
admin 更改状态以发布 2023年5月21日
首先,你调用的重载方法post(String, Object...)
并不是你认为的那样运作。第二个Object
参数是用来填充第一个参数传入的URL模板的。详见JavaDoc的解释。
因此,你需要在从post()
方法得到的MockHttpServletRequestBuilder
上调用content(String)
方法。
现在,为了解决类似这样的问题,建议你稍微改变一下测试的结构,以便更容易进行调试。
例如:
String content = "{}"; MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("/api/v1/something") .contentType(APPLICATION_JSON) .content(content); MvcResult result = mvc.perform(request) .andReturn(); // andExpect(status().isOk()) // andExpect(...) // ;
我会从硬编码的JSON内容(或其他硬编码但简单的内容)开始,使用调试器检查每个局部变量是否符合我的预期。
这样,你就可以检查得到的MvcResult
,以确定出错的原因。
一旦测试成功,你可以删除andReturn()
,并取消注释断言(例如andExpect(status().isOk())
)。