現在、SpringBootにて、コントローラーのテストを書いています。
内容は、ユーザーフォームに値を入力後、post通信し、データベースへ入力されたデータを保存するといったテストとなっています。
しかし、自作したバリテーションが走ってしまいテストを突破出来ません。
原因は、テストを実行時、自作のValitationクラス内にある、UserServiceフィールドへ値をDI出来ていないのが原因だと推測します。
テスト実行時に、自作バリテーション内のフィールドへDIするにはどうすれば良いでしょうか。
以上、お手数お掛致しますが、ご教授の程よろしくお願い致します。
↓コントローラー
java
1@Controller 2@SessionAttributes(value = "singupForm") 3public class SignUpFormController { 4 5 private final UserService userService; 6 7 @Autowired 8 public SignUpFormController(UserService userService) { 9 this.userService = userService; 10 } 11 12 @ModelAttribute(value = "signupForm") 13 public SignupForm setUserForm() { 14 return new SignupForm(); 15 } 16 17 @GetMapping("/signup") 18 public String getSignUp(SignupForm signupForm, Model model) { 19 return "user/signup"; 20 } 21 22 @PostMapping("/signup") 23 public String postSignUp(@ModelAttribute(value = "signupForm") @Validated(GroupOrder.class) SignupForm signupForm, 24 BindingResult bindingResult, 25 RedirectAttributes redirectAttributes, 26 Model model) { 27 28 //ここが通過出来ません。 29 if (bindingResult.hasErrors()) { 30 System.out.println(bindingResult.toString()); 31 return getSignUp(signupForm, model); 32 } 33 //ここまで 34 35 String result = ""; 36 37 try { 38 userService.create(signupForm); //insert実行 39 result = "登録に成功しました。"; 40 } catch (DataAccessException e) { 41 e.printStackTrace(); 42 result = "登録に失敗しました。"; 43 } 44 45 redirectAttributes.addFlashAttribute("flash", result); 46 return "redirect:/login"; 47 } 48 49 @GetMapping("/login") 50 public String getLogin(Model model) { 51 return "user/login"; 52 } 53 54 @PostMapping("/login") 55 public String postLogin(Model model) { 56 return "redirect:/home"; 57 } 58 59 @PostMapping("/logout") 60 public String postLogout() { 61 return "redirect:/login"; 62 } 63 64}
↓コントローラーテスト
java
1@RunWith(SpringJUnit4ClassRunner.class) 2@SpringBootTest 3public class SignupFormControllerTests { 4 5 private MockMvc mockMvc; 6 7 @MockBean 8 UserService mockFormService; 9 10 @Autowired 11 private SignUpFormController target; 12 13 @Before 14 public void setup() { 15 this.mockMvc = MockMvcBuilders.standaloneSetup(this.target).build(); 16 } 17 18 @Test 19 public void フォームに入力後ログイン画面に飛べるか() throws Exception { 20 // when 21 mockMvc.perform(post("/signup") 22 .param("name", "takachan") 23 .param("mail", "taka0317@yahoo.co.jp") 24 .param("confirmMail", "taka0317@yahoo.co.jp") 25 .param("password", "password") 26 .param("confirmPassword", "password") 27 .param("year", "1993") 28 .param("month", "3") 29 .param("day", "18")) 30 .andExpect(status().isOk()) 31 .andExpect(redirectedUrl("/login")); 32 } 33
↓バリテーションクラス
java
1public class UnusedValidator implements ConstraintValidator<Unused, String> { 2 3 @Autowired 4 private UserService userService; //←UserServiceクラスをインジェクションしたい。 5 6 public void initialize(Unused constraintAnnotation) { 7 } 8 9 public boolean isValid(String value, ConstraintValidatorContext context) { 10 11 Boolean result = false; 12 System.out.println(userService); //Nullになります。 13 14 try { 15 result = userService.mailExists(value); 16 } catch (Exception e) { 17 e.printStackTrace(); 18 } 19 20 return result; 21 22 } 23}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/24 06:47