JUnit

JUnitのテストメソッドに汎用的な開始・終了ログを出力してみた

Javaでは、実行中のクラスパスや実行中のメソッド名を取得することができる。

今回は、以前作成したJUnitのソースコード上で、実行中のクラス名・メソッド名を取得し、開始/終了ログを出力してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

PowerMockを利用して処理途中でnewしているクラスをMock化してみた処理途中でnewしているクラスをMock化するには、PowerMockitoのwhenNewメソッドを利用する必要がある。また、Powe...

作成したサンプルプログラムの内容と実行結果

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

変更したテストクラスの内容は以下の通り。

package com.example.demo;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.ui.Model;
import java.time.LocalDateTime;
import java.util.Map;
import static org.junit.Assert.assertEquals;

//demoComponentクラスのインスタンス生成処理をMock化するためPowerMockを利用し、
//@PrepareForTestアノテーションで、テスト対象クラスとMockクラスを指定
@RunWith(PowerMockRunner.class)
@PrepareForTest({DemoController.class, DemoComponent.class})
public class DemoControllerTest {

    /**
     * テスト対象のクラス
     * (インスタンス生成をinitメソッドで実行するため、アノテーションは付与していない)
     */
    private DemoController demoController;

    /**
     * テスト対象のクラス内で呼ばれるクラスのMockオブジェクト
     * (インスタンス生成をinitメソッドで実行するため、アノテーションは付与していない)
     */
    private DemoComponent demoComponent;

    /**
     * クラス名
     * (initメソッド内で設定する)
     */
    private String classPath;

    /**
     * 前処理(各テストケースを実行する前に行われる処理)
     */
    @Before
    public void init() throws Exception {
        //テスト対象クラスで呼ばれるクラスとそのインスタンス生成処理をMock化
        //finalメソッドをMock化できるようにするには、PowerMockを利用する必要がある
        demoComponent = PowerMockito.mock(DemoComponent.class);
        PowerMockito.whenNew(DemoComponent.class).withNoArguments()
            .thenReturn(demoComponent);

        //テスト対象クラスのインスタンスを生成
        demoController = new DemoController();

        //Mockの設定
        Mockito.when(demoComponent.getNowDateTime())
            .thenReturn(getNowDateTimeStr());
        Mockito.when(demoComponent.getNowDateTimeFinal())
            .thenReturn(getNowDateTimeStr());

        //クラスパスをフルパスで設定
        classPath = this.getClass().getName();
    }

    /**
     * DemoControllerクラスのindexメソッドを確認
     */
    @Test
    public void testDemoController(){
        //メソッド名を取得し、開始ログを出力
        String methodName = new Object(){}.getClass().getEnclosingMethod().getName();
        printStartLog(methodName);

        //Modelオブジェクトを生成
        Model model = DemoControllerTestUtil.getModel();
        //テスト対象クラスのメソッドを実行
        String strPath = demoController.index(model);

        //テスト対象クラスのメソッドで設定されたMapオブジェクトを表示
        System.out.println("*** コントローラクラスのindexメソッドで設定されたMapオブジェクト ***");
        System.out.println(model.asMap());

        //テスト対象クラスのメソッドの実行結果を確認
        assertEquals("index", strPath);
        Map<String, Object> mapObj = model.asMap();
        assertEquals("2020-07-14T20:54:12", mapObj.get("nowDateTime"));
        assertEquals("2020-07-14T20:54:12", mapObj.get("nowDateTimeFinal"));

        //終了ログを出力
        printEndLog(methodName);
    }

    /**
     * 現在時刻を生成し文字列化して返却
     * @return 現在時刻の文字列
     */
    private String getNowDateTimeStr(){
        LocalDateTime nowDateTime = LocalDateTime.of(
                2020, 7, 14, 20, 54, 12);
        return nowDateTime.toString();
    }

    /**
     * 開始ログを出力
     * @param methodName メソッド名
     */
    private void printStartLog(String methodName){
        System.out.println();
        System.out.println("===== " + classPath + "クラス " 
            + methodName + "メソッド 開始 =====");
    }

    /**
     * 終了ログを出力
     * @param methodName メソッド名
     */
    private void printEndLog(String methodName){
        System.out.println("===== " + classPath + "クラス " 
            + methodName + "メソッド 終了 =====");
        System.out.println();
    }
}

initメソッド内で実行中クラスパスを取得し、testDemoControllerメソッド内で実行中メソッド名を取得している。また、開始ログをprintStartLogメソッドで、終了ログをprintEndLogメソッド内で出力している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-print-startend-log/demo



Code VillageはJavaScriptを中心としたサポート体制が充実したプログラミングスクールだったJavaScriptや、JavaScriptのフレームワーク「React」「Vue」を中心にオンラインで学習できるプログラミングスクール...

DemoControllerTestクラスを実行した結果は以下の通りで、赤枠の開始ログ/終了ログが出力されていることが確認できる。
テストプログラムの実行結果

要点まとめ

  • Javaでは、実行中のクラスパスや実行中のメソッド名を取得することができる。