かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その4 )( AbstractJsonpResponseBodyAdvice を削除し、失敗しているテストを成功させる )

概要

記事一覧はこちらです。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その3 )( build.gradle を変更する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • AbstractJsonpResponseBodyAdvice が非推奨になったので、使用しないようにします。
    • 失敗しているテストを解消します。

参照したサイト・書籍

目次

  1. AbstractJsonpResponseBodyAdvice を削除する
  2. 失敗しているテストを成功させる
    1. ksbysample.webapp.lending.listener.rabbitmq.InquiringStatusOfBookQueueListenerTest > testReceiveMessage FAILED
    2. ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest > ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest$貸出承認画面の正常処理時のテスト.確定ボタンをクリックした場合_却下と却下理由 FAILED
    3. ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.存在するユーザ名でもパスワードが正しくなければログインはエラーになる FAILED
    4. ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.ログインを5回失敗すればアカウントはロックされる FAILED
  3. 次回は。。。

手順

AbstractJsonpResponseBodyAdvice を削除する

JavascriptJSONP で WebAPI を呼び出しているところはなかったので、src/main/java/ksbysample/webapp/lending/config/JsonpAdvice.java を削除します。

失敗しているテストを成功させる

失敗していた4件のテストを1つずつ見ていきます。

ksbysample.webapp.lending.listener.rabbitmq.InquiringStatusOfBookQueueListenerTest > testReceiveMessage FAILED

f:id:ksby:20180908171519p:plain f:id:ksby:20180908171703p:plain

テストが失敗した原因は、org.apache.commons.lang3.builder.ToStringBuilder#reflectionToString で java.lang.NullPointerException が発生していたためでした。

f:id:ksby:20180908174827p:plain

テストを Debug 実行して調べると、this.correlationId が null のため this.correlationId.hashCode()NullPointerException が発生していました。

もう少し調べた結果、以下の原因であることが分かりました。

  • テストのために、本来は RabbitMQ から受信するはずの Message オブジェクトをテストメソッド内で生成していました。下の画像の赤枠の部分です。 f:id:ksby:20180908185542p:plain
  • この時 messageConverter.toMessage(...) の第2引数に MessageProperties オブジェクトが必要なので new MessageProperties() と書いていたのですが、これだと correlationId に値をセットしていません。
  • messageConverter.toMessage(...) の後に listener.receiveMessage(message); を呼び出しているのですが、listener.receiveMessage(...); が呼び出されると MethodLogger#logginBeginMethod によりメソッドの情報をログに出力しようとします。この時 MessageProperties#hashCode が呼び出されるのですが、this.correlationId が null なので NullPointerException が発生していました。

NullPointerException が発生しないようにするには correlationId をセットすればよさそうです。MessageProperties を生成するための MessagePropertiesBuilder というクラスを見つけたので、new MessageProperties()MessagePropertiesBuilder.newInstance().setCorrelationId("test").build() に変更します。

f:id:ksby:20180908190713p:plain

変更後にテストを実行すると成功しました。

f:id:ksby:20180908191019p:plain

ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest > ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest$貸出承認画面の正常処理時のテスト.確定ボタンをクリックした場合_却下と却下理由 FAILED

f:id:ksby:20180908195737p:plain f:id:ksby:20180908195952p:plain

テストが失敗した原因は、メールの中身が "承認" ではなく "却下" になっていたためでした。

テストメソッドを見たら public void 確定ボタンをクリックした場合_却下と却下理由() throws Exception { ... } と書いていて、どうも却下のテストをしているので "却下" になっているのが正しいのでは?と思って調べたら、単に前回の修正ミスでした。メソッド内の messageTxt001Resource.getFile()messageTxt002Resource.getFile() に修正します。

修正後にテストを実行すると成功しました。

f:id:ksby:20180908201021p:plain

ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.存在するユーザ名でもパスワードが正しくなければログインはエラーになる FAILED

f:id:ksby:20180908201623p:plain

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" というエラーメッセージが出ていました。

stackoverflow を検索すると以下のページが見つかりました。

Spring Security 5.0.0.RC1 Released の「Password Storage Format」にパスワードの文字列のフォーマットが {id}encodedPassword に変更されたと書かれています。テストで使用している DB に保存されているパスワードには {id} の部分を付けていないので java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" のエラーが出たようです。DB に保存するパスワードは bcrypt で暗号化しているので、先頭に {bcrypt} の文字列を追加するようにします。

以下のファイルを変更します。

  • src/test/resources/testdata/assertdata/user_info.csv
  • src/test/resources/testdata/base/user_info.csv

f:id:ksby:20180908210436p:plain

変更後にテストを実行すると成功しました。

f:id:ksby:20180908210824p:plain

ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.ログインを5回失敗すればアカウントはロックされる FAILED

このエラーも出ていたのですが、上の "{bcrypt}" を入れる対応をしたら出なくなりました。

次回は。。。

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。

f:id:ksby:20180908212230p:plain

次回は checkstyle、PMD をバージョンアップします。

履歴

2018/09/08
初版発行。