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

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

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

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

Java

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

Spring

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

Q&A

解決済

2回答

4373閲覧

Spring Testを使用したバリデーションメッセージの取得

kumaneko

総合スコア15

JUnit

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

Java

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

Spring

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

0グッド

0クリップ

投稿2020/07/25 18:56

編集2020/07/25 18:58

Spring Test(JUnit)を使用してControllerのテストを行いたいと考えています。
Controllerのメソッドの引数であるFormに設定しているバリデータのエラーメッセージ(プロパティで定義したもの)が定義したものであることを確認したいのですが、テストの戻り値から取得できるのは定義前のメッセージだけで、定義したものが取得できません。
どのようにすれば、バリデーションに対して定義したエラーメッセージを取得することができるでしょうか。

■ValidationMessages.properties

Java

1// JUnitでの実行の結果、ここで定義したメッセージを取得したい。 2javax.validation.constraints.NotNull.message=未入力です。

■Form

Java

1public class Form { 2 @NotNull 3 public String input; 4 // 以降 略 5}

■Controller

Java

1public class Controller { 2 @RequestMapping(path = "home", method = RequestMethod.POST) 3 public String index(@Validated Form form, 4 BindingResult result, Model model) { 5 if (result.hasErrors()) { 6 return "test/test"; 7 } 8 // 略 9 } 10}

■JUnitコード

Java

1@Before 2public void setup() { 3 // 略 4} 5 6@Test 7public void testRegisterConfirm01() throws Exception { 8 9 // ResultActionsからBindingResultを取得して 10 // DefaultMessageを参照しても、プロパティで定義したメッセージではなく、 11 // 定義前のメッセージが設定されている。 12 ResultActions results = mockMvc.perform(post("/home") 13 .param("input", ""); 14 15 }

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/07/25 20:59

Testからではなく、Springアプリケーションとして実行した場合はpropertiesのメッセージがとれているのでしょうか
guest

回答2

0

ベストアンサー

記載されているテストケース

java

1ResultActions results = mockMvc.perform(post("/home") 2 .param("input", "");

では、@NotNullのValidationエラーになりません。(ちなみに閉じカッコも不足しています)

テスト用に設定を変更していなければ、実行環境(src/main/resources)のValidationMessages.propertiesがテスト側にも適用されます。
src/test/resources に同名のファイルがあれば、テスト用のメッセージ定義に切り替わります。

ちなみに、BindingResultを取得するロジックが書かれていないのと、テストコンテキストが書かれていないため想像できる可能性として、BindingResultの取得方法が想定外の取得をしているか、ValidationMessages.propertiesがテスト用に別途設定されているのを無視しているか、など可能性はいくつかあります。

BindingResultの取得と検証については、以下で正しく取得ができます。

java

1 @Test 2 public void displayFailure() throws Exception { 3 ResultActions resultActions = mockMvc.perform(post("/display")); 4 resultActions.andExpect(model().errorCount(1)); 5 6 ModelAndView mnv = resultActions.andReturn().getModelAndView(); 7 BindingResult result = (BindingResult)mnv.getModel().get(BindingResult.MODEL_KEY_PREFIX + "messageForm"); 8 9 assertEquals("未入力です。", result.getFieldError().getDefaultMessage()); 10 }

投稿2020/07/26 02:37

A-pZ

総合スコア12011

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

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

kumaneko

2020/07/27 18:31

ご指摘ありがとうございます。 ご教示いただいた方法で問題なく取得できました。
guest

0

コメント欄で指摘を受けたので取り消し

(特に手を加えていなければ)テスト実行時のクラスパスはsrc/main/resourcesではなくsrc/test/resourcesなので、テスト実行時にDefaultMessageを参照すると定義前の値が設定されていると考えられます。

ValidationMessages.propertiessrc/test/resources配下にも配置してアプリケーション実行時と同様の定義をしてあげれば、アプリケーション実行時と同様のメッセージが取得できると思います。

投稿2020/07/25 23:24

編集2020/07/26 03:06
oskamathis

総合スコア35

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

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

退会済みユーザー

退会済みユーザー

2020/07/26 00:23

むしろ逆なきがする。 test にも同名のファイルがあるから main のファイルが無視される。 test には設定が記述されていない。
oskamathis

2020/07/26 02:50

訂正コメントありがとうございます! 僕の理解も間違っているようなので、これを機会にもう一度プロパティとクラスパス関連を勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問