Java Junit测试HTTP POST请求不起作用。

31 浏览
0 Comments

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日
0
0 Comments

首先,你调用的重载方法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()))。

0