2017-03-05 20 views
3
私はテストを実行しようとしている、次のエラーを取得しています

の無効なターゲット:春ブーツ - テスト - バリ:バリ

org.springframework.web.util.NestedServletException:要求の処理に失敗しました。ネストされた例外は、java.lang.IllegalStateExceptionある:バリの無効なターゲット[userCreateFormValidatorビーン]:[email protected]によって引き起こさ

。java.lang.IllegalStateException:バリの無効なターゲット[userCreateFormValidator bean]:[email protected] at org.springframework.validation.DataBinder.assertValidators(DataBinder.java:567) at org.springframework.validation.DataBinder.addValidators(DataBinder.java:578) at com.ar.empresa.controllers.UserController.initBinder(UserController.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) at sun.reflect.NativeMethodAccessorImpl。呼び出し(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invokeで (Method.java:498)

コードであります:

コントローラー:

@Controller 
public class UserController { 
private UserService userService; 
private UserCreateFormValidator userCreateFormValidator; 

@Autowired 
public UserController(UserService userService, UserCreateFormValidator userCreateFormValidator) { 
    this.userService = userService; 
    this.userCreateFormValidator = userCreateFormValidator; 
} 

@InitBinder("form") 
public void initBinder(WebDataBinder binder) { 
    binder.addValidators(userCreateFormValidator); 
} 

@PreAuthorize("hasAuthority('ADMIN')") 
@RequestMapping(value = "/user/create", method = RequestMethod.GET) 
public ModelAndView getUserCreatePage() { 
    return new ModelAndView("user_create", "form", new UserCreateForm()); 
} 

@PreAuthorize("hasAuthority('ADMIN')") 
@RequestMapping(value = "/user/create", method = RequestMethod.POST) 
public String handleUserCreateForm(@Valid @ModelAttribute("form") UserCreateForm form, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     return "user_create"; 
    } 
    try { 
     userService.create(form); 
    } catch (DataIntegrityViolationException e) { 
     bindingResult.reject("email.exists", "Email already exists"); 
     return "user_create"; 
    } 
    return "redirect:/users"; 
} 
} 

バリ:

@Component 
public class UserCreateFormValidator implements Validator { 

private final UserService userService; 

@Autowired 
public UserCreateFormValidator(UserService userService) { 
    this.userService = userService; 
} 

@Override 
public boolean supports(Class<?> clazz) { 
    return clazz.equals(UserCreateForm.class); 
} 

@Override 
public void validate(Object target, Errors errors) { 
    UserCreateForm form = (UserCreateForm) target; 
    validatePasswords(errors, form); 
    validateEmail(errors, form); 
} 

private void validatePasswords(Errors errors, UserCreateForm form) { 
    if (!form.getPassword().equals(form.getPasswordRepeated())) { 
     errors.reject("password.no_match", "Passwords do not match"); 
    } 
} 

private void validateEmail(Errors errors, UserCreateForm form) { 
    if (userService.getUserByEmail(form.getEmail()).isPresent()) { 
     errors.reject("email.exists", "User with this email already exists"); 
    } 
} 
} 

UserCr eateForm:

public class UserCreateForm { 

@NotEmpty 
private String email = ""; 

@NotEmpty 
private String password = ""; 

@NotEmpty 
private String passwordRepeated = ""; 

@NotNull 
private Role role = Role.USER; 

public String getEmail() { 
    return email; 
} 

public String getPassword() { 
    return password; 
} 

public String getPasswordRepeated() { 
    return passwordRepeated; 
} 

public Role getRole() { 
    return role; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public void setPasswordRepeated(String passwordRepeated) { 
    this.passwordRepeated = passwordRepeated; 
} 

public void setRole(Role role) { 
    this.role = role; 
} 
} 

テスト:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserControllerTest { 

private MockMvc mockMvc; 

private MediaType contentType = new MediaType(APPLICATION_JSON.getType(), 
     APPLICATION_JSON.getSubtype(), 
     Charset.forName("utf8")); 

@MockBean 
private UserService userService; 

@MockBean 
private UserCreateFormValidator userCreateFormValidator; 

@Autowired 
FilterChainProxy springSecurityFilterChain; 

@Before 
public void setup() { 
    this.mockMvc = MockMvcBuilders.standaloneSetup(new UserController(userService,userCreateFormValidator)).apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain)).build(); 
} 

@Test 
@WithMockUser(username="user", 
     password="password", 
     roles="ADMIN") 
public void homePage_authenticatedUser() throws Exception { 
    mockMvc.perform(get("/user/create")) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("user_create")); 
} 
} 

それはGETメソッドであるので、私は、なぜ知らないので、それはそれを検証する必要はありません。 ありがとう! :)

答えて

3

userCreateFormValidator@Mockbeanpublic boolean supports(Class<?> clazz)メソッドの動作を偽っていないため、この例外があります。 投稿したログからorg.springframework.validation.DataBinder.assertValidators(DataBinder.java)のコードを見ると、バリデーターがどのように処理され、どのようにjava.lang.IllegalStateExceptionがスローされるのかを見つけることができます。あなたは春のコードを引き起こし、バリのsupports方法を模擬し、デフォルトでfalseを返しませんでした。この

if(validator != null && this.getTarget() != null && !validator.supports(this.getTarget().getClass())) { 
    throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + this.getTarget()); 
} 

ようSpring 4.3.8では、上記IllegalStateExceptionをスローに見えます。あなたのバリデータにsupports方法を模擬する必要が

TLDR、ちょうど私の溶液を得ました。 @Beforeまたは@BeforeClassメソッドに以下を追加してください。

when(requestValidatorMock.supports(any())).thenReturn(true); 
+0

この回答は承認される必要があります。 – Doug