質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2105閲覧

テスト実行時に、自作したValidation内のフィールドへDIする方法

tattakahiiii

総合スコア27

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/02/23 11:27

現在、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のSpring BootのIssueによればご質問の挙動(Autowiredされない点)は仕様のようです。

Spring ConstraintValidator is not injected properly #12879

The constraint validator is created by Hibernate, not Spring so it won't be turned magically into a bean.
constraint validatorは、SpringではなくHibernateによって作成されるため、魔法のようにBeanに変換されることはありません。

なので

  1. UserServiceによるバリデーションを外へ切り出すか、
  2. バリデーションをHibernate側で行わないようにする

という対応になると思います。

2)の方法ではSpring側で行うバリデーションになるので、Autowiredは有効になります。(ただし、すべてバリデーションをHibernateで行うかSpringで行うかの2択になります)
参考になるページを2つ共有致しますのでご覧になってください。

投稿2020/02/24 02:16

rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tattakahiiii

2020/02/24 06:47

springframework側のValitatorを使用したら出来ました。 御回答誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問