以前このブログにて、セッションからリストを取得するユーティリティクラスを作成してみたが、今回はそのJUnitのソースコードを作成してみたので、そのサンプルプログラムを共有する。
今回のサンプルプログラムでは、リクエスト・セッションオブジェクトをMock化し、テストカバレッジ=100%になるようにしている。
前提条件
下記記事の実装が完了していること。
ユーティリティクラスの良い例と悪い例を実装してみたごく単純なJavaクラスの実装であっても、実装方法はいくつか考えられるため、その中で「最も良い」実装方法を検討し選択する必要がある。今回...
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。
今回のテスト対象となるユーティリティクラスの内容は以下の通りで、nullを返却するロジックの通過場所が分かるよう、標準出力文を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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%になるため、実施していない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | 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テストクラスの実行結果は以下の通りで、テストが正常に実行されていることが確認できる。
フリーランスエンジニアのエージェントは就業中でも無料で登録できるITエンジニアには、フリーランスという働き方がある。 フリーランスとは、会社や団体などに所属せず、仕事に応じて自由に契約する人のこ...
2) 実行カバレッジの実行結果は以下の通りで、テスト対象クラスについて100%のカバレッジになっていることが確認できる。
要点まとめ
- MockHttpServletRequestクラスでリクエストのMock化を、MockHttpSessionクラスでセッションのMock化を行うことができる。
- テストカバレッジ=100%になるようにするには、各ロジックを全て通るようなテストコードを作成する必要がある。