【问题标题】:Java Junit test HTTP POST request not workingJava Junit测试HTTP POST请求不起作用
【发布时间】:2022-11-04 02:07:39
【问题描述】:

所以我正在尝试向我的 API 添加集成测试,我通过 Postman 测试了所有 GET/POST/PUT.. 方法,它们都可以工作,但是我无法让它们在带有 mockito 的 JUnit 上工作,有什么想法吗?

@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 正文,并且该方法无法将其添加到数据库中。

TLDR; Post 请求适用于 Postman,不适用于 Junit。我认为这是因为我没有通过测试方法正确提供 JSON 内容,有什么想法吗?

【问题讨论】:

  • 换句话说,实时代码表明测试被破坏了。测试策略就这么多...
  • 不会同意的。所有功能都按预期工作,这是我第一次在项目中实施集成测试。 Postman 是一个 UI,因此在使用它设置测试时显然更容易使用。
  • 您是否在调试器中检查了content 以查看 JSON 是否被正确读取?控制台输出是否显示来自 API 调用(“服务器”端)的解析/绑定的任何错误消息?
  • 检查响应的内容(正文),看看是否有任何有用的东西可以帮助您进行故障排除。请参阅this answer 了解如何执行此操作。
  • 是的,JSON 字符串本身被正确读取,不存在任何解析/绑定问题。

标签: java spring testing mocking spring-test


【解决方案1】:

一方面,您调用的重载方法post(String, Object...) 并没有按照您的想法执行。辅助 Object 参数用于填充在第一个参数中传递的 URL 模板。见the JavaDoc for explanation。 所以你需要在从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()))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多