gpt4 book ai didi

java - 如何为包含 Errors/BindingResult 的 Controller 编写测试?

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:48 30 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 Spring MVC 开发一个简单的网站,并且遇到了一个我无法编写测试的场景。如何测试 Controller 如何处理错误,这些错误会影响用户界面,但不包含在ModelAndView中?

我在 HTML 表单中显示错误消息时遇到了问题,经过多次挫折后,我发现这是因为我在将 Form 对象作为 ModelAndView 中的对象返回之前覆盖了该对象。

这是有问题的代码

@PostMapping
ModelAndView processPost(@Valid IdAndAmountForm idAndAmountForm, Errors errors) {
if (errors.hasErrors()) {
var beer = service.findBeerById(idAndAmountForm.getId());
return new ModelAndView("beerView")
.addObject("beer", beer)
.addObject("idAndAmountForm", idAndAmountForm);
} else {
cart.add(idAndAmountForm);
return new ModelAndView("redirect:/cart");
}
}

它的工作/行为符合预期,在删除 HTML 验证时使用适当的消息填充 span

    <form th:action="@{/beer}" th:object="${idAndAmountForm}" method="post">
<label>
Amount
<span th:errors="*{amount}"></span>
<input th:field="*{amount}" type="number" min="1" required>
</label>

我的错误出现在 Controller 的第 7 行,之前我有 .addObject("idAndAmountForm", new IdAndAmountForm());没有与新表单相关的错误,因此没有显示错误消息。或者这就是我认为发生的事情。

现在我如何编写一个测试来检测这种错误行为?我花了一些时间剖析模型,查找我知道以某种方式传递给 Thymeleaf 模板的错误消息,然后得出错误消息由 Spring 单独处理的结论。 This answer帮助我看到我想在测试中检查的是 BindingResultErrors 对象。但是,它不是我编写的任何方法的返回值的一部分。

我想我可以尝试为 ViewResolver 或 Controller 和模板之间任何自动生成的中间对象编写测试,或者我可以破坏我的 Controller 类以允许我的测试类访问错误。两者似乎都是坏主意。当前的解决方案是考虑场景需要花费太多精力来测试,但我不喜欢相信这是原则上无法测试的。

最佳答案

你可以用Spring编写一个Controller测试来实现你想要的。 Spring MVC 测试框架提供了一个非常漂亮且易于阅读的流畅 API,可用于使用 MockMvc 测试 MVC 中的各种场景。

对于您的用例,测试模型属性绑定(bind)结果错误,您可能会编写一个使用 MockMvcResultMatchers 和静态 status()model()view()flash() 等的测试

花点时间探索这些并看看可以调用它们的方法。例如,在模型中,您有多种与 fieldErrors 相关的方法,并且您可以根据需要进行精确的检查。最后你的测试类将如下所示:

mockMvc.perform(post(YOUR_URL).contentType(APPLICATION_FORM_URLENCODED)
.param(...)
.param(...)
.andExpect(model().hasErrors())
.andExpect(model().attributeHasFieldErrors(FORM_MODEL_NAME, "field"))
.andExpect(model().attributeHasFieldErrorCode(FORM_MODEL_NAME, "anotherfield", "error")
.andExpect(view().name(YOUR_VIEW));

有关 Spring MVC 测试框架的更多信息: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-mvc-test-framework

关于java - 如何为包含 Errors/BindingResult 的 Controller 编写测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55535796/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com