Java JUnit4の使い方とテストのサンプル

JavaのJUnit4の使い方とテストのサンプルです。
確認環境 (Eclipse4.8、junit-4.12、Java 10)

目次 1.JUnitでテストするコード
  2.テストクラスを作成する / assertThatの構文
  3.テストクラスを修正する
  4.テストクラスを実行する
  5.例外をテストする方法
  6.コンストラクタでセットされた値をテストする方法
  7.JUnit4で使用するアノテーション(@Before,@After)

1.JUnitでテストするコード

以下は、JUnitでテストするコードです。

package test1;

class Color1 {
	String getColor(int i) {

		if (i == 1) {
			return "赤";

		} else if (i == 2) {
			return "青";
			
		} else {
			return "1or2を入力して下さい";
		}
	}
}

4行目のメソッドに対して、別にテストクラスを新規作成してJUnitでテストを行います。
テストクラスでは、以下のテストメソッドを記述します。
・引数に1をセットしたら「赤」が返ってくること
・引数に2をセットしたら「青」が返ってくること
・引数に1,2以外をセットしたら「1or2を入力して下さい」が返ってくること

2.テストクラスを作成する

テストクラスを作成します。

1.テストするクラスを右クリックし「新規」→「JUnitテスト・ケース」をクリックします。
※ない場合は、「新規」→「その他」→「Java」→「JUnit」を選択してJUnitテスト・ケースを選択します。

 

2.「新規JUnit4テスト」を選択します。
「名前」はテストクラスとわかるように指定したクラス名にTestの文字を追加します。
「テスト元クラス」は上記手順で右クリックしたクラスが入っています。「次へ」を押します。

 

3.テストするクラスとメソッドにチェックを入れ、「完了」を押します。

 

4.JUnit4ライブラリがビルドパスに追加されていない場合、以下のダイアログが表示されます。「JUnit4ライブラリーをビルド・パスに追加」の上にある「次のアクションを実行」を選択して「OK」を押します。

 

5.フォルダとファイル構成は以下のようになります。

jarファイルは、元々Eclipseの\eclipse\pluginsに配置されていたもので上記手順で追加されます。

 

6.作成したテストクラスのコードは以下のようになります。
8行目のfailは、テストを失敗させるメソッドです。

package test1;
import static org.junit.Assert.*;
import org.junit.Test;

public class Color1Test {
	@Test
	public void testGetColor() {
		fail("まだ実装されていません");
	}
}

 

3.テストクラスを修正する

テストクラスを以下のように修正します。

package test1;
import static org.junit.Assert.*;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;

public class Color1Test {

	@Test
	public void testGetColor1() {
		Color1 c1 = new Color1();
		String t1 = c1.getColor(1);
		assertThat(t1,is("赤"));	
	}
	@Test
	public void testGetColor2() {
		Color1 c1 = new Color1();
		String t1 = c1.getColor(2);
		assertThat(t1,is("青"));	
	}
	@Test
	public void testGetColor3() {
		Color1 c1 = new Color1();
		String t1 = c1.getColor(3);
		assertThat(t1,is("1or2を入力して下さい"));	
	}
}

9,15,21行目は、テストメソッドとわかるようにtestの文字を入れます。

テストを行うメソッドごとに@Testアノテーションをつけます。

assertThatのisメソッドを使用するため4行目を手動で追加(コピペ)します。
12,18,24行目は、メソッドの戻り値が想定の値かどうかを確認しています。
比較するメソッドはassertEqualsではなく、Junit4.4で追加されたassertThatが良いです。
可読性が上がります。

assertThatの構文

assertThatの構文は以下のとおりです。

assertThat(実際の値,is(期待の値))

 

4.テストクラスを実行する

テストクラスを実行します。

1.テストクラスを右クリックしダイアログを開きます。

 

2.ダイアログの下にある「実行」>「JUnitテスト」をクリックするとJUnitテストが実行されます。

 

3.想定どうりの結果のため成功しました。
成功だと緑色の帯が表示されます。
test1.Color1Testの横の印をクリックすると下にメソッドが展開されます。

 

4.想定が違った場合、赤の帯が表示されます。

対象のメソッドを選択すると障害トレースに内容が表示されます。
この例では、testGetColor2を選択しました。
→テストクラスは「青」を想定していましたが、結果は「オレンジ」でした。

 

5.例外をテストする方法

例外をテストする方法です。

6行目は、強制的にNullPointerExceptionの例外を投げるようにしています。
テストクラスでは、引数に1をセットしたらNullPointerExceptionになることを確認します。

package test1;

class Color1 {
	String getColor(int i) {
		if (i == 1) {
			throw new NullPointerException("テスト1");
		} else {
			return "1以外です";
		}
	}
}

 

以下はテストクラスです。

package test1;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.CoreMatchers.*;

public class Color1Test {
	//テストメソッド その1
	@Test(expected = NullPointerException.class)
	public void testGetColor1() {
		Color1 c1 = new Color1();
		String t1 = c1.getColor(1); //エラーなし
	}
	//テストメソッド その2
	@Test
	public void testGetColor2() {
		try {
			Color1 c1 = new Color1();
			String t1 = c1.getColor(1); //エラーになる
		}catch(NullPointerException expected){
			assertThat(expected.getMessage(), equalTo("テスト1"));
		}
	}
	//テストメソッド その3
	@Rule
	public ExpectedException ee1 = ExpectedException.none();
	@Test
	public void testGetColor3() {
			ee1.expect(NullPointerException.class);
			ee1.expectMessage("テスト1");
			Color1 c1 = new Color1();
			String t1 = c1.getColor(1); //エラーなし
	}
}

テストメソッドその1

10行目は、@Testの後にexpectedとNullPointerException.classを指定しています。
次のテストでは、NullPointerExceptionが発生する想定になります。
13行目は、引数に1をセットしています。
想定どうりNullPointerExceptionが発生するので、JUnitは成功になります。
10行目の@Testの後の(expected~)を削除すると、13行目は失敗になります。

テストメソッドその2

16~24行目は、上記と同じくNullPointerExceptionになることを想定しています。
20行目でNullPointerExceptionが発生するので21行目のcatchに投げられ22行目でJUnitの成功になります。

テストメソッドその3

26行目は、@Ruleアノテーションをつけています。
28~34行目は、上記と同じくNullPointerExceptionになることを想定しています。
ExpectedExceptionで、例外の種類とメッセージを指定しています。
30,31行目で例外と文言を指定しています。
33行目はJUnitで成功になります。

6.コンストラクタでセットされた値をテストする方法

コンストラクタでセットされた値をテストする方法です。

6~8行目は、コンストラクタで4行目のメンバ変数に値をセットしています。
テストクラスでは、インスタンス生成時に、想定した値が4行目のメンバ変数にセットされていることを確認します。

package test1;

class Color1 {
	private String name1;
	
	public Color1(String name) {
		this.name1 = "色は、" + name + "です";
	}
	public String getName() {
		return name1;
	}
}

 

以下はテストクラスです。

package test1;
import static org.junit.Assert.*;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;

public class Color1Test {

	@Test
	public void testGetColor1() {
		Color1 c1 = new Color1("赤");
		assertThat(c1.getName(),is("色は、赤です"));
	}
}

10行目は、コンストラクタの引数を指定しています。
11行目は、JUnitで成功になります。

7.JUnit4で使用するアノテーション(@Before,@After)

JUnit4で使用するアノテーションです。

package test1;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class Test1Test {
	@BeforeClass
	public static void testBeforeClass() {
		System.out.println("BeforeClass");
	}
	@AfterClass
	public static void testAfterClass() {
		System.out.println("AfterClass");
	}
	@Before
	public void testBefore() {
		System.out.println("Before");
	}
	@After
	public void testAfter() {
		System.out.println("After");
	}
	@Test
	public void test1() {
		System.out.println("test1");
	}
	@Ignore
	public void test2() {
		System.out.println("test2");
	}
	@Test
	public void test3() {
		System.out.println("test3");
	}
}

10行目の@BeforeClassは、テストクラス単位で最初に1回実行されます。
14行目の@AfterClassは、テストクラス単位で最後に1回実行されます。
18行目の@Beforeは、テストメソッドの前に実行されます。
22行目の@Afterは、テストメソッドの後に実行されます。
30行目の@Ignoreは、テストメソッドを実行しません。

実行結果の流れは以下のようになります。
実行されるテストメソッドが2個あるのでBeforeとAfterは2回実行されます。
BeforeClass
Before
test1
After
Before
test3
After
AfterClass

関連の記事

Java JMockitを使用するサンプル
Java assertThatメソッドのサンプル

△上に戻る