かんがるーさんの日記

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

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その17 )( テストクラスのモックを @MockBean + Mockito で作り直す2 )

概要

記事一覧はこちらです。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その16 )( テストクラスのモックを @MockBean + Mockito で作り直す ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • LendingUserDetailsHelper に @Component アノテーションを付加して Bean にし、static メソッドを止めます。
    • LendingUserDetailsHelper を使用しているクラスを修正します。
    • その後で前回修正できなかった BooklistServiceTest.java を修正します。

参照したサイト・書籍

目次

  1. LendingUserDetailsHelper.java の @Component アノテーションを付加して Bean にする
  2. LendingUserDetailsHelper を使用しているクラスを修正する
  3. BooklistServiceTest.java を修正する
  4. build.gradle から JMockit を外す
  5. 全てのテストを実行してみる
  6. 次回は。。。

手順

LendingUserDetailsHelper.java の @Component アノテーションを付加して Bean にする

  1. src/main/java/ksbysample/webapp/lending/security/LendingUserDetailsHelper.javaリンク先の内容 に変更します。

LendingUserDetailsHelper を使用しているクラスを修正する

  1. src/main/java/ksbysample/webapp/lending/security/LendingUserDetailsHelper.java の getLoginUserId メソッドにカーソルを移動して右クリックしてコンテキストメニューを表示した後、「Find Usages」を選択します。

    f:id:ksby:20170402182817p:plain

  2. 画面下に使用箇所一覧が表示されますので、以下のように修正します。

    f:id:ksby:20170402183020p:plain

    • フィールド変数 private final LendingUserDetailsHelper lendingUserDetailsHelper; を追加し、コンストラクタインジェクションの処理も追加します。ただしテストクラスの場合には @Autowired private LendingUserDetailsHelper lendingUserDetailsHelper; を追加し、コンストラクタインジェクションにはしません。
    • LendingUserDetailsHelper#getLoginUserId を呼び出している箇所の記述を LendingUserDetailsHelper.getLoginUserId()lendingUserDetailsHelper.getLoginUserId() に変更します。

    修正したのは以下のソースです。

    • src/main/java/ksbysample/webapp/lending/web/booklist/BooklistService.java
    • src/main/java/ksbysample/webapp/lending/web/confirmresult/ConfirmresultController.java
    • src/main/java/ksbysample/webapp/lending/web/lendingapproval/LendingapprovalService.java
    • src/test/java/ksbysample/webapp/lending/security/LendingUserDetailsHelperTest.java

BooklistServiceTest.java を修正する

  1. src/test/java/ksbysample/webapp/lending/web/booklist/BooklistServiceTest.javaリンク先の内容 に変更します。

  2. BooklistServiceTest クラスのテストのみ実行し、成功することを確認します。

    f:id:ksby:20170402185442p:plain

build.gradle から JMockit を外す

  1. build.gradle の dependencies から testCompile("org.jmockit:jmockit:1.30") を削除します。

全てのテストを実行してみる

  1. まずは clean タスク → Rebuild Project → build タスクを実行して正常に終了することを確認します。

    f:id:ksby:20170402192245p:plain

  2. 次に Project Tool Window の src/test から「Run ‘All Tests’ with Coverage」を実行して、全てのテストが成功することを確認します。

    f:id:ksby:20170402192642p:plain

次回は。。。

今回のテストクラスの対応で 1.4 系へのバージョンアップの作業自体はほぼ終了ですが、他にやっておきたいものを書き上げてみました。やりたいものから進めてみます。

  • Spring Boot のバージョンを 1.4.4 → 1.4.5 に上げます。
  • application.properties に spring.datasource.tomcat の最低限の設定しか記述していないので、設定を見直してみます。
  • Log4jdbc Spring Boot Starter というライブラリが出ていました。興味があるので試してみたいと思います。
  • Gradle のバージョンが 2.13 なので 3.x へ上げます。
  • 他に気になっている点を修正します。
    • FreeMarkerUtils は内容が Helper クラスなので、クラス名やパッケージを変更します。
    • application.properties から hibernate.dialect, spring.jpa.~ を削除します。
    • ValidationMessages_ja_JP.properties をやめて messages.properties に1本化し、かつ IDEA の Transparent native-to-ascii conversion のチェックを外して UTF-8 の文字列のまま保存されるようにします。
    • Hibernate を無効にしているので hibernate.properties は不要な気がするので削除してみます。

ソースコード

LendingUserDetailsHelper.java

@Component
public class LendingUserDetailsHelper {

    /**
     * 現在ログインしているユーザのユーザIDを取得する
     *
     * @return ユーザID(user_info.user_id)
     */
    public Long getLoginUserId() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        LendingUserDetails lendingUserDetails = (LendingUserDetails) auth.getPrincipal();
        return lendingUserDetails.getUserId();
    }

}
  • クラスに @Component アノテーションを付加します。
  • getLoginUserId メソッドから static を削除します。

BooklistServiceTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class BooklistServiceTest {

    private static final String MAILADDR_TANAKA_TARO = "tanaka.taro@sample.com";

    @Rule
    @Autowired
    public TestDataResource testDataResource;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private BooklistService booklistService;

    @MockBean
    private LendingUserDetailsHelper lendingUserDetailsHelper;

    @Test
    public void testTemporarySaveBookListCsvFile() throws Exception {
        given(lendingUserDetailsHelper.getLoginUserId()).willReturn(1L);

        UploadBooklistForm uploadBooklistForm = new UploadBooklistForm();
        // テスト用のユーティリティクラスを作るべきですが、今回は他のテストクラスのメソッドをそのまま使います
        BooklistCsvFileServiceTest booklistCsvFileServiceTest = new BooklistCsvFileServiceTest();
        uploadBooklistForm.setFileupload(booklistCsvFileServiceTest.createNoErrorCsvFile());

        ..........
  • @MockBean private LendingUserDetailsHelper lendingUserDetailsHelper; を追加します。
  • testTemporarySaveBookListCsvFile メソッド内の処理を new Expectations(LendingUserDetailsHelper.class) {{ ... }};given(lendingUserDetailsHelper.getLoginUserId()).willReturn(1L); へ変更します。

履歴

2017/04/04
初版発行。