日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC集成测试:断言给定的模型属性有全局错误

發(fā)布時(shí)間:2023/12/3 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC集成测试:断言给定的模型属性有全局错误 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為了使用Bean驗(yàn)證報(bào)告Spring MVC中的全局錯誤,我們可以創(chuàng)建一個自定義的類級別約束注釋。 全局錯誤與已驗(yàn)證Bean中的任何特定字段都不相關(guān)。 在本文中,我將展示如何使用Spring Test編寫測試,以驗(yàn)證給定的model屬性是否存在全局驗(yàn)證錯誤。


自定義(類級別)約束

為了本文的方便,我創(chuàng)建了一個相對簡單的類級別約束,稱為SamePassword ,并由SamePasswordValidator進(jìn)行了SamePasswordValidator :

@Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) @Constraint(validatedBy = SamePasswordsValidator.class) @Documented public @interface SamePasswords {String message() default "passwords do not match";Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

如下所示,驗(yàn)證器非常簡單:

public class SamePasswordsValidator implements ConstraintValidator<SamePasswords, PasswordForm> {@Overridepublic void initialize(SamePasswords constraintAnnotation) {}@Overridepublic boolean isValid(PasswordForm value, ConstraintValidatorContext context) {if(value.getConfirmedPassword() == null) {return true;}return value.getConfirmedPassword().equals(value.getPassword());} }

PasswordForm只是一個帶有一些約束注釋的POJO,包括我剛創(chuàng)建的POJO:

@SamePasswords public class PasswordForm {@NotBlankprivate String password;@NotBlankprivate String confirmedPassword;// getters and setters omitted for redability}

@Controller

控制器有兩種方法:顯示表單和處理表單的提交:

@Controller @RequestMapping("globalerrors") public class PasswordController {@RequestMapping(value = "password")public String password(Model model) {model.addAttribute(new PasswordForm());return "globalerrors/password";}@RequestMapping(value = "password", method = RequestMethod.POST)public String stepTwo(@Valid PasswordForm passwordForm, Errors errors) {if (errors.hasErrors()) {return "globalerrors/password";}return "redirect:password";} }

當(dāng)密碼驗(yàn)證失敗時(shí),將在BindingResult (在上面的示例中為Errors中注冊一個全局錯誤。 例如,我們可以在HTML頁面的表單頂部顯示此錯誤。 在Thymeleaf中,這將是:

<div th:if="${#fields.hasGlobalErrors()}"><p th:each="err : ${#fields.globalErrors()}" th:text="${err}">...</p> </div>

集成測試與Spring Test

讓我們設(shè)置一個集成測試:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration public class AccountValidationIntegrationTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();} }

第一個測試驗(yàn)證發(fā)送帶有空的表單password和confirmedPassword失敗:

@Testpublic void failsWhenEmptyPasswordsGiven() throws Exception {this.mockMvc.perform(post("/globalerrors/password").param("password", "").param("confirmedPassword", "")).andExpect(model().attributeHasFieldErrors("passwordForm", "password", "confirmedPassword")).andExpect(status().isOk()).andExpect(view().name("globalerrors/password"));}

在上面的示例中,測試將驗(yàn)證password字段和confirmedPassword字段是否均存在字段錯誤。

同樣,我想驗(yàn)證當(dāng)給定的密碼不匹配時(shí),是否出現(xiàn)特定的全局錯誤。 因此,我期望這樣的事情: .andExpect(model().hasGlobalError("passwordForm", "passwords do not match")) 。 不幸的是,由MockMvcResultMatchers#model()返回的ModelResultMatchers沒有提供斷言給定模型屬性具有全局錯誤的方法。

由于不存在該匹配器,因此我創(chuàng)建了從ModelResultMatchers擴(kuò)展的自己的匹配器。 Java 8版本的代碼如下:

public class GlobalErrorsMatchers extends ModelResultMatchers {private GlobalErrorsMatchers() {}public static GlobalErrorsMatchers globalErrors() {return new GlobalErrorsMatchers();}public ResultMatcher hasGlobalError(String attribute, String expectedMessage) {return result -> {BindingResult bindingResult = getBindingResult(result.getModelAndView(), attribute);bindingResult.getGlobalErrors().stream().filter(oe -> attribute.equals(oe.getObjectName())).forEach(oe -> assertEquals("Expected default message", expectedMessage, oe.getDefaultMessage()));};}private BindingResult getBindingResult(ModelAndView mav, String name) {BindingResult result = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + name);assertTrue("No BindingResult for attribute: " + name, result != null);assertTrue("No global errors for attribute: " + name, result.getGlobalErrorCount() > 0);return result;} }

通過上述添加,我現(xiàn)在可以驗(yàn)證全局驗(yàn)證錯誤,如下所示:

import static pl.codeleak.demo.globalerrors.GlobalErrorsMatchers.globalErrors;@Test public void failsWithGlobalErrorWhenDifferentPasswordsGiven() throws Exception {this.mockMvc.perform(post("/globalerrors/password").param("password", "test").param("confirmedPassword", "other")).andExpect(globalErrors().hasGlobalError("passwordForm", "passwords do not match")).andExpect(status().isOk()).andExpect(view().name("globalerrors/password")); }

如您所見,擴(kuò)展Spring Test的匹配器并提供給您自己的匹配器相對容易,可用于改進(jìn)集成測試中的驗(yàn)證驗(yàn)證。

資源資源

  • 可以在這里找到本文的源代碼: https : //github.com/kolorobot/spring-mvc-beanvalidation11-demo 。

翻譯自: https://www.javacodegeeks.com/2014/08/spring-mvc-integration-testing-assert-the-given-model-attributes-have-global-errors.html

總結(jié)

以上是生活随笔為你收集整理的Spring MVC集成测试:断言给定的模型属性有全局错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。