Javaのプログラムの単体テストを自動化するツールに「Junit」があり、これを利用すると、テストを自動化でき、繰り返し実行できるようになる。
今回は、Javaの単体テストを自動化できる「Junit」の、よく使うアサーションである、org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」を使用した、作成したJunitのサンプルプログラムを共有する。
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」までの手順が完了していること。
サンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。

なお、上図の赤枠は、今回記載するサンプルプログラムの内容である。
「build.gradle」については、以下の通りで、前提条件の内容と特に変更していない。「testImplementation ‘org.springframework.boot:spring-boot-starter-test’」が入っていることにより、junitのアサーションが利用できる。
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
実際に外部ライブラリを確認すると、下図の赤枠のように、junitが含まれている。

また、テスト対象のプログラム「DemoUtil.java」の内容は以下の通り。今回は、下記クラス内のpublicメソッドをテスト対象にしている。
package com.example.demo;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
public class DemoUtil {
/**
* 日付チェック処理を行う
* @param year 年
* @param month 月
* @param day 日
* @return 判定結果(1:年が空、2:月が空、3:日が空、4:年月日が不正、0:正常
*/
public static int checkDate(String year, String month, String day){
final String dateFormat = "uuuuMMdd";
if(isEmpty(year)){
return 1;
}
if(isEmpty(month)){
return 2;
}
if(isEmpty(day)){
return 3;
}
String dateStr = year + addZero(month) + addZero(day);
if(!isCorrectDate(dateStr, dateFormat)){
return 4;
}
return 0;
}
/**
* 数値文字列が1桁の場合、頭に0を付けて返す
* @param intNum 数値文字列
* @return 変換後数値文字列
*/
public static String addZero(String intNum){
if(isEmpty(intNum)){
return intNum;
}
if(intNum.length() == 1){
return "0" + intNum;
}
return intNum;
}
/**
* 引数の文字列がnull、空文字かどうかを判定する
* @param str チェック対象文字列
* @return 文字列チェック結果
*/
public static boolean isEmpty(String str){
if(str == null || "".equals(str)){
return true;
}
return false;
}
/**
* DateTimeFormatterを利用して日付チェックを行う
* @param dateStr チェック対象文字列
* @param dateFormat 日付フォーマット
* @return 日付チェック結果
*/
private static boolean isCorrectDate(String dateStr, String dateFormat){
if(isEmpty(dateStr) || isEmpty(dateFormat)){
return false;
}
//日付と時刻を厳密に解決するスタイルで、DateTimeFormatterオブジェクトを作成
DateTimeFormatter df = DateTimeFormatter.ofPattern(dateFormat)
.withResolverStyle(ResolverStyle.STRICT);
try{
//チェック対象文字列をLocalDate型の日付に変換できれば、チェックOKとする
LocalDate.parse(dateStr, df);
return true;
}catch(Exception e){
return false;
}
}
}
さらに、作成したJUnitプログラム「DemoUtilTest.java」の内容は以下の通り。テスト対象となるメソッドには、アノテーション「@Test」を付与している。org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」を使用して、テスト対象メソッドの戻り値を確認している。
package com.example.demo;
import org.junit.Test;
import static org.junit.Assert.*;
public class DemoUtilTest {
/**
* DemoUtilクラスのcheckDateメソッドの確認
*/
@Test
public void testCheckDate(){
//第一引数yearがnullまたは空文字の場合に、1が返ってくることを確認
//assertEquals(期待値, 実際の値)は、期待値=実際の値であればOKと判断する
int return1 = DemoUtil.checkDate(null, "12", "14");
assertEquals(1, return1);
//第二引数monthがnullまたは空文字の場合に、2が返ってくることを確認
int return2 = DemoUtil.checkDate("2019", "", "14");
assertEquals(2, return2);
//第三引数dayがnullまたは空文字の場合に、3が返ってくることを確認
int return3 = DemoUtil.checkDate("2019", "12", null);
assertEquals(3, return3);
//引数のyear,month,dayがあり得ない日付の場合に、4が返ってくることを確認
int return4 = DemoUtil.checkDate("2019", "2", "29");
assertEquals(4, return4);
//引数のyear,month,dayが正しい日付の場合に、5が返ってくることを確認
int return5 = DemoUtil.checkDate("2019", "12", "14");
assertEquals(0, return5);
}
@Test
public void testAddZero(){
//引数がnullの場合に、nullが返ってくることを確認
//assertNull(実際の値)は、実際の値=nullであればOKと判断する
String return1 = DemoUtil.addZero(null);
assertNull(return1);
//引数が空文字の場合に、空文字が返ってくることを確認
String return2 = DemoUtil.addZero("");
assertEquals("", return2);
//引数が1桁の文字列の場合に、先頭に0が付与されることを確認
String return3 = DemoUtil.addZero("1");
assertEquals("01", return3);
//引数が2桁以上の文字列の場合に、引数の値が返ってくることを確認
String return4 = DemoUtil.addZero("11");
assertEquals("11", return4);
}
@Test
public void testIsEmpty(){
//引数がnullの場合に、trueが返ってくることを確認
//assertTrue(実際の値)は、実際の値=trueであればOKと判断する
boolean return1 = DemoUtil.isEmpty(null);
assertTrue(return1);
//引数が空文字の場合に、trueが返ってくることを確認
boolean return2 = DemoUtil.isEmpty("");
assertTrue(return2);
//引数がnull・空文字以外の場合に、falseが返ってくることを確認
//assertFalse(実際の値)は、実際の値=falseであればOKと判断する
boolean return3 = DemoUtil.isEmpty("abcde");
assertFalse(return3);
}
}
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-assertion/demo
また、作成したJUnitプログラムを実行するには、下図のように、通常のJavaプログラムの実行と同じように、対象プログラムを右クリックし「実行」を選択する。

実行した結果は下図の通りで、JUnitプログラムが正常終了することが確認できた。

なお、今回取り上げた以外にも、様々なアサーションが利用できる。その内容については以下を参照のこと。
https://waman.hatenablog.com/entry/20120923/1348350852
要点まとめ
- JUnitのテスト対象となるメソッドには、アノテーション「@Test」を付与する。
- org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」等のアサーションを利用すると、想定結果と合っているかの確認が行える。





