JUnit

セッションからリストを取得するユーティリティクラスのJUnitテストを行ってみた

以前このブログにて、セッションからリストを取得するユーティリティクラスを作成してみたが、今回はそのJUnitのソースコードを作成してみたので、そのサンプルプログラムを共有する。

今回のサンプルプログラムでは、リクエスト・セッションオブジェクトをMock化し、テストカバレッジ=100%になるようにしている。

前提条件

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

ユーティリティクラスの良い例と悪い例を実装してみたごく単純なJavaクラスの実装であっても、実装方法はいくつか考えられるため、その中で「最も良い」実装方法を検討し選択する必要がある。今回...



サンプルプログラムの作成

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

今回のテスト対象となるユーティリティクラスの内容は以下の通りで、nullを返却するロジックの通過場所が分かるよう、標準出力文を追加している。

package com.example.demo;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;

// セッションから指定したキー値に対応するリストを取得するユーティリティクラス
public class DemoUtil {

    /**
     * セッションから指定したキー値に対応するリストを取得する
     * @param key キー値
     * @return 指定したキー値に対応するリスト
     */
    public static List<String> getHashList(String key){
        // リクエストオブジェクトがnullの場合は、nullを返却する
        ServletRequestAttributes requestAttributes
              = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if(requestAttributes == null){
            System.out.println("DemoUtil.getHashList : requestAttributes is null");
            return null;
        }
        // セッションがnullの場合は、nullを返却する
        HttpSession session = requestAttributes.getRequest().getSession(false);
        if(session == null){
            System.out.println("DemoUtil.getHashList : session is null");
            return null;
        }
        // セッションからHashMapが取得できない場合は、nullを返却する
        HashMap<String, List<String>> hashMap
                = (HashMap<String, List<String>>)session.getAttribute("sesHashMap");
        if(hashMap == null){
            System.out.println("DemoUtil.getHashList : hashMap is null");
            return null;
        }
        // HashMapから引数で指定されたキーを取得する
        return hashMap.get(key);
    }
}
削除または保存していないWordドキュメントの復元方法【4DDiG Windowsデータ復元】ワード(Word)データ等のファイルを誤って削除してしまった場合は、通常はデータの復元ができませんが、4DDiGというソフトウェアを利用...

また、今回のテストクラスの内容は以下の通りで、テストカバレッジ=100%になるように各ロジックを全て通るようなテストコードを作成している。なお、このプログラムのコメントに記載している通り、HashMapにキー項目が無い場合、キー項目にnullや空文字が指定された場合などについてのテストについては、テストを行わなくてもテストカバレッジ=100%になるため、実施していない。

package com.example.demo;

import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletWebRequest;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class DemoUtilTest {

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

    /**
     * 前処理(各テストケースを実行する前に行われる処理)
     */
    @Before
    public void init(){
        // クラスパスをフルパスで設定
        classPath = this.getClass().getName();
    }

    /**
     * リクエストオブジェクトがNULLの場合を確認するためのテスト
     */
    @Test
    public void testGetHashList01(){
        // メソッド名を取得し、開始ログを出力
        String methodName
                = new Object(){}.getClass().getEnclosingMethod().getName();
        printStartLog(methodName);

        // カバレッジを100%にするためテスト対象クラスを生成
        new DemoUtil();

        // テスト対象メソッドを実行
        List<String> hashList = DemoUtil.getHashList("key01");
        System.out.println(
                "DemoUtil.getHashListメソッドで取得したhashList : " + hashList);
        assertNull(hashList);

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

    /**
     * セッションがNULLの場合を確認するためのテスト
     */
    @Test
    public void testGetHashList02(){
        // メソッド名を取得し、開始ログを出力
        String methodName
                = new Object(){}.getClass().getEnclosingMethod().getName();
        printStartLog(methodName);

        // テスト対象メソッドを実行するためのリクエストオブジェクトを生成
        HttpServletRequest request = new MockHttpServletRequest();
        RequestContextHolder.setRequestAttributes(new ServletWebRequest(request));

        // テスト対象メソッドを実行
        List<String> hashList = DemoUtil.getHashList("key01");
        System.out.println(
                "DemoUtil.getHashListメソッドで取得したhashList : " + hashList);
        assertNull(hashList);

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

    /**
     * セッションからHashMapが取得できない場合を確認するためのテスト
     */
    @Test
    public void testGetHashList03(){
        // メソッド名を取得し、開始ログを出力
        String methodName
                = new Object(){}.getClass().getEnclosingMethod().getName();
        printStartLog(methodName);

        // テスト対象メソッドを実行するためのリクエスト・セッションオブジェクトを生成
        HttpServletRequest request = new MockHttpServletRequest();
        ((MockHttpServletRequest)request).setSession(new MockHttpSession());
        RequestContextHolder.setRequestAttributes(new ServletWebRequest(request));

        // テスト対象メソッドを実行
        List<String> hashList = DemoUtil.getHashList("key01");
        System.out.println(
                "DemoUtil.getHashListメソッドで取得したhashList : " + hashList);
        assertNull(hashList);

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

    /**
     * セッションからHashMapとその対応するリストが取得できる場合を確認するためのテスト
     */
    /*
      注意事項:
      HashMapにキー項目が無い場合、キー項目にnullや空文字が指定された場合など、
      他にもいろいろなケースは考えられるが、hashMap.get(key)の動作を確認するだけという観点で
      テストを行えばよいので、この1ケースのみでよい
     */
    @Test
    public void testGetHashList04(){
        // メソッド名を取得し、開始ログを出力
        String methodName
                = new Object(){}.getClass().getEnclosingMethod().getName();
        printStartLog(methodName);

        // セッションに設定するハッシュマップを生成
        MockHttpSession session = new MockHttpSession();
        HashMap<String, List<String>> hashMap = new HashMap<>();
        hashMap.put("key1", Arrays.asList("item1", "item2", "item3"));
        hashMap.put("key2", Arrays.asList("item4", "item5"));
        session.setAttribute("sesHashMap", hashMap);

        // テスト対象メソッドを実行するためのリクエスト・セッションオブジェクトを生成
        HttpServletRequest request = new MockHttpServletRequest();
        ((MockHttpServletRequest)request).setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletWebRequest(request));

        // テスト対象メソッドを実行
        List<String> hashList = DemoUtil.getHashList("key1");
        System.out.println(
                "DemoUtil.getHashListメソッドで取得したhashList : " + hashList);
        assertEquals(hashMap.get("key1").toString(), hashList.toString());

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

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

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



サンプルプログラムの実行結果

今回作成したサンプルプログラムの実行結果は、以下の通り。

1) JUnitテストクラスの実行結果は以下の通りで、テストが正常に実行されていることが確認できる。
サンプルプログラムの実行結果_1_1

サンプルプログラムの実行結果_1_2



フリーランスエンジニアのエージェントは就業中でも無料で登録できるITエンジニアには、フリーランスという働き方がある。 フリーランスとは、会社や団体などに所属せず、仕事に応じて自由に契約する人のこ...

2) 実行カバレッジの実行結果は以下の通りで、テスト対象クラスについて100%のカバレッジになっていることが確認できる。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2

要点まとめ

  • MockHttpServletRequestクラスでリクエストのMock化を、MockHttpSessionクラスでセッションのMock化を行うことができる。
  • テストカバレッジ=100%になるようにするには、各ロジックを全て通るようなテストコードを作成する必要がある。