Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その4 )( AbstractJsonpResponseBodyAdvice を削除し、失敗しているテストを成功させる )
概要
記事一覧はこちらです。
Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その3 )( build.gradle を変更する ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- AbstractJsonpResponseBodyAdvice が非推奨になったので、使用しないようにします。
- 失敗しているテストを解消します。
参照したサイト・書籍
Spring Security 5 : There is no PasswordEncoder mapped for the id “null”
https://stackoverflow.com/questions/49654143/spring-security-5-there-is-no-passwordencoder-mapped-for-the-id-nullSpring Security 5.0.0.RC1 Released
https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-encoding
目次
- AbstractJsonpResponseBodyAdvice を削除する
- 失敗しているテストを成功させる
- ksbysample.webapp.lending.listener.rabbitmq.InquiringStatusOfBookQueueListenerTest > testReceiveMessage FAILED
- ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest > ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest$貸出承認画面の正常処理時のテスト.確定ボタンをクリックした場合_却下と却下理由 FAILED
- ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.存在するユーザ名でもパスワードが正しくなければログインはエラーになる FAILED
- ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.ログインを5回失敗すればアカウントはロックされる FAILED
- 次回は。。。
手順
AbstractJsonpResponseBodyAdvice を削除する
Javascript で JSONP で WebAPI を呼び出しているところはなかったので、src/main/java/ksbysample/webapp/lending/config/JsonpAdvice.java を削除します。
失敗しているテストを成功させる
失敗していた4件のテストを1つずつ見ていきます。
ksbysample.webapp.lending.listener.rabbitmq.InquiringStatusOfBookQueueListenerTest > testReceiveMessage FAILED
テストが失敗した原因は、org.apache.commons.lang3.builder.ToStringBuilder#reflectionToString で java.lang.NullPointerException が発生していたためでした。
テストを Debug 実行して調べると、this.correlationId
が null のため this.correlationId.hashCode()
で NullPointerException が発生していました。
もう少し調べた結果、以下の原因であることが分かりました。
- テストのために、本来は RabbitMQ から受信するはずの Message オブジェクトをテストメソッド内で生成していました。下の画像の赤枠の部分です。
- この時
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()
に変更します。
変更後にテストを実行すると成功しました。
ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest > ksbysample.webapp.lending.web.lendingapproval.LendingapprovalControllerTest$貸出承認画面の正常処理時のテスト.確定ボタンをクリックした場合_却下と却下理由 FAILED
テストが失敗した原因は、メールの中身が "承認" ではなく "却下" になっていたためでした。
テストメソッドを見たら public void 確定ボタンをクリックした場合_却下と却下理由() throws Exception { ... }
と書いていて、どうも却下のテストをしているので "却下" になっているのが正しいのでは?と思って調べたら、単に前回の修正ミスでした。メソッド内の messageTxt001Resource.getFile()
→ messageTxt002Resource.getFile()
に修正します。
修正後にテストを実行すると成功しました。
ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.存在するユーザ名でもパスワードが正しくなければログインはエラーになる FAILED
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
というエラーメッセージが出ていました。
stackoverflow を検索すると以下のページが見つかりました。
- Spring Security 5 : There is no PasswordEncoder mapped for the id “null”
- Spring Security 5.0.0.RC1 Released
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}
の文字列を追加するようにします。
以下のファイルを変更します。
変更後にテストを実行すると成功しました。
ksbysample.webapp.lending.web.LoginControllerTest > ksbysample.webapp.lending.web.LoginControllerTest$ログインエラーのテスト.ログインを5回失敗すればアカウントはロックされる FAILED
このエラーも出ていたのですが、上の "{bcrypt}" を入れる対応をしたら出なくなりました。
次回は。。。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。
次回は checkstyle、PMD をバージョンアップします。
履歴
2018/09/08
初版発行。