Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Formのテストを実装しました。 #10

Merged
merged 6 commits into from
Sep 1, 2022
Merged

Formのテストを実装しました。 #10

merged 6 commits into from
Sep 1, 2022

Conversation

mkmmr
Copy link
Owner

@mkmmr mkmmr commented Aug 29, 2022

概要(このPRの対応範囲)

  • ToDoFormとToDoUpdateFormのテストを実装しました。

やったこと

  • テスト機能の実装
    • ToDoFormTest クラス
      • 正しい値を入力した時にバリデーションエラーとならないこと
      • nullを入力した時にバリデーションエラーとなること
      • 空文字を入力した時にバリデーションエラーとなること
      • limitDateに有効な型以外を入力した時にバリデーションエラーとなること
    • ToDoUpdateForm クラス
      • 正しい値を入力した時にバリデーションエラーとならないこと
      • nullを入力した時にバリデーションエラーとならないこと
      • 空文字を入力した時にバリデーションエラーとならないこと
      • limitDateに有効な型以外を入力した時にバリデーションエラーとなること

@mkmmr mkmmr force-pushed the add-form-test branch 2 times, most recently from 4b9251d to 07df5dc Compare August 29, 2022 15:05
@mkmmr
Copy link
Owner Author

mkmmr commented Aug 29, 2022

Formに関するテストが3点失敗しております。
いずれもバリデーションメッセージの言語に関するものです。

IntelliJでは日本語で問題なくテストできたのですが、Github Actionsではバリデーションメッセージが英語になるらしく、それでテストが失敗しているようです。
ValidationMessages_ja.propertiesを作成し、テストの時だけを読み込むことができないかとも考えたのですが、調べてもよくわかりませんでした。

何かいいやり方がありましたらご教示いただけますと幸いです。
そもそもConstraintViolationではなくBindingResultを使ったらよかったのでしょうか……。

  1. build/classes/java/test/com/raisetech/todo/form/ToDoFormTest.class:80 | java.lang.AssertionError: Expecting ArrayList: [("task", "must not be blank"), ("task", "size must be between 1 and 256")] to contain only: [("task", "1 から 256 の間のサイズにしてください"), ("task", "空白は許可されていません")] element(s) not found: [("task", "1 から 256 の間のサイズにしてください"), ("task", "空白は許可されていません")] and element(s) not expected: [("task", "must not be blank"), ("task", "size must be between 1 and 256")]

  2. build/classes/java/test/com/raisetech/todo/form/ToDoFormTest.class:57 | java.lang.AssertionError: Expecting ArrayList: [("limitDate", "must not be blank"), ("task", "must not be blank")] to contain only: [("limitDate", "空白は許可されていません"), ("task", "空白は許可されていません")] element(s) not found: [("limitDate", "空白は許可されていません"), ("task", "空白は許可されていません")] and element(s) not expected: [("limitDate", "must not be blank"), ("task", "must not be blank")]

  3. build/classes/java/test/com/raisetech/todo/form/ToDoUpdateFormTest.class:63 | java.lang.AssertionError: Expecting ArrayList: [("task", "size must be between 1 and [25](https://github.com/mkmmr/todo/runs/8074180953?check_suite_focus=true#step:6:27)6")] to contain only: [("task", "1 から 256 の間のサイズにしてください")] element(s) not found: [("task", "1 から 256 の間のサイズにしてください")] and element(s) not expected: [("task", "size must be between 1 and 256")]

Comment on lines 19 to 20
@SpringBootTest(classes = {ValidationAutoConfiguration.class})
@ExtendWith(MockitoExtension.class)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このあたり必要でしょうか?
なくても動くと思いました。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なくても動きました。
不要なアノテーションを削除しました。 1dad501

@ExtendWith(MockitoExtension.class)
class ToDoFormTest {

@InjectMocks

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらもinjectするモックがないので不要かと思います。

Copy link
Owner Author

@mkmmr mkmmr Sep 1, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ToDoForm.java内にgetLimitDateメソッドがあって、下記2点をおこなっています。

  • String型からLocalDate型への変換
  • バリデーションチェック

「limitDateに有効な型以外を入力した時にバリデーションエラーとなること」という名前のテストでgetLimitDateメソッドを使用しているので、モック化が必要だと思い記述しています。

なくてもテストできるでしょうか?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なしでテストしてみてくれますか?
要らないと思います。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@InjectMocksがなくても動きました。
必要だと思っていました。Junitの理解がまだまだ足りないようです……。

@InjectMocksを削除しました。 474b89a

class ToDoFormTest {

@InjectMocks
ToDoForm toDoForm;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

となるとこれもいらないですね。

Copy link
Owner Author

@mkmmr mkmmr Sep 1, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらも上記と同じ理由で記載しています。

@yoshi-koyama
Copy link

たしかにロケール(locale)の問題が絡んでくるか・・・。
以下でうまくいくかどうか試してみてくれますか?
①テストコード内にロケールを指定する
https://stackoverflow.com/questions/16466258/how-to-customize-the-locale-for-javax-validation

static {
    Locale.setDefault(Locale.JAPAN);
}

②ワークフロー内でubuntuのロケールを変更する
test_gradle.yml に手を加えてlocaleを変更してみてほしいです。
参考:https://qiita.com/tailak/items/77b90a4df07e4f6a1fc2

上村さんのローカルPCでも使えると思いますがlocaleコマンドでロケール情報が出力されますのでワークフロー内でlocaleコマンドを実行してロケールが正しく変更できているかどうか確認しつつ進めてほしいです。

@mkmmr
Copy link
Owner Author

mkmmr commented Sep 1, 2022

ありがとうございます。

  1. テストコード内にロケールを指定する 7d4a11e
  2. ワークフロー内でubuntuのロケールを変更する(こちらを参考にしました) f1c8175

この2つを行ったところ、Github上でも無事にテストが成功するようになりました。

@mkmmr mkmmr merged commit 266bb99 into main Sep 1, 2022
@mkmmr mkmmr deleted the add-form-test branch September 1, 2022 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants