代码之家  ›  专栏  ›  技术社区  ›  fall

使用SpringMVC Maven测试有效注释

  •  1
  • fall  · 技术社区  · 7 年前

    我正在处理第5章中的Spring一书的例子。当我运行测试类时,我发现其中一个@Valid Test没有工作,似乎验证从未发生过(返回的状态代码为302,视图的名称为“/spitter/null”)。然而,当我在Tomcat中运行它时,它工作得很好。

    ValidationJAR(hibernate验证器及其依赖项)由Maven加载。

    github .

    测试代码段:

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(classes={RootConfig.class, WebConfig.class})
    public class SpitterControllerTest {
        @Test
        public void shouldFailValidationWithNoData() throws Exception {
            SpitterRepository mockRepository = mock(SpitterRepository.class);    
            SpitterController controller = new SpitterController(mockRepository);
            MockMvc mockMvc = standaloneSetup(controller).build();
    
            mockMvc.perform(post("/spitter/register"))
                .andExpect(status().isOk())
                .andExpect(view().name("registerForm"))
                .andExpect(model().errorCount(5))
                .andExpect(model().attributeHasFieldErrors(
                    "spitter", "firstName", "lastName", "username", "password", "email"));
        }
    }
    

      @RequestMapping(value="/register", method=POST)
      public String processRegistration(
          @Valid Spitter spitter, 
          Errors errors) {
        if (errors.hasErrors()) {
          return "registerForm";
        }
    
        spitterRepository.save(spitter);
        return "redirect:/spitter/" + spitter.getUsername();
      }
    

    @NotNull
      @Size(min=5, max=16)
      private String username;
    
      @NotNull
      @Size(min=5, max=25)
      private String password;
    
      @NotNull
      @Size(min=2, max=30)
      private String firstName;
    
      @NotNull
      @Size(min=2, max=30)
      private String lastName;
    
      @NotNull
      @Email
      private String email;
    

    谢谢!

    3 回复  |  直到 7 年前
        1
  •  1
  •   Sean Carroll    7 年前

    我克隆了您的存储库,并能够通过将您的jsp api依赖项更新为2.2来实现有效性

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    

    您可能需要查看该依赖关系的更新版本。在使用2.1版本时,没有向ExtendedServletRequestDataBinder注册/添加验证器,或者更准确地说,SpringValidatorAdapter targetValidator为null。

    OptionalValidatorFactoryBean.afterPropertiesSet

    javax.validation。ValidationException:HV000183:无法初始化 “javax.el.ExpressionFactory”。检查您是否具有EL依赖项 或者改用ParameterMessageInterpolator

    我注意到您更新了ShouldFailValidationWithNodeData测试以使用webAppContextSetup,但仍然调用了 mock(SpitterRepository.class) 这是不必要的。

        2
  •  1
  •   fall    7 年前

    post 的最佳答案,它奏效了。我改变了 hibernate-validator 版本自 5.4.1.final 5.2.4.final 在pom中。这个 github

        3
  •  0
  •   Arpit Aggarwal    7 年前

    标记您的 SpitterController @Validated

    import org.springframework.validation.annotation.Validated;
    
    @Controller
    @Validated
    @RequestMapping("/spitter")
    public class SpitterController {
    

    @Autowired Spitter控制器 MethodValidationPostProcessor 委托给 JSR-303

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(classes = { RootConfig.class, WebConfig.class,
            SpitterControllerTest.Config.class })
    public class SpitterControllerTest {
    
        @Autowired
        private SpitterController spitterController;
    
        @Configuration
        public static class Config {
            @Bean
            public MethodValidationPostProcessor methodValidationPostProcessor() {
                return new MethodValidationPostProcessor();
            }
        }
    
        @Test
        public void shouldFailValidationWithNoData() throws Exception {
        }
    
    }