【JUnit】Enclosed.classを利用したテストを使ってみる

はじめに

今回使用する環境は、下記になります。

  • JUnit4
  • Springboot
  • eclipse

Enclosed.classの使い方

Enclosed.classは、JUnitのテストクラスにインナークラスを定義できるようになる機能です。
使用方法は下記のようになります。

@RunWith(Enclosed.class)
public class ApplicationTests {
	/**
	 * 登録テスト
	 */
	@RunWith(SpringRunner.class)
	@SpringBootTest
	public class register_test{
		@Test
		public void case1() {
		    //ここにテストコードを記載する
		}
	}
}

クラスに@RunWith(Enclosed.class)のアノテーションをつけることでインナークラスで@Testがついたテストメソッドも認識をしてテストを行ってくれます。

Enclosed.classでできること

見た目上のメリットとしては、例として画面のテストでは、初期表示、登録ボタンといったイベントごとにクラスを分けて行うことでコードがわかりやすくなります。
機能的なメリットは、DBUnitなどや@Beforeなどの機能でイベントごとにデータを定義したい場合などは、下記のようにすることによって、分けることができます。

@RunWith(Enclosed.class)
public class ApplicationTests {

	/**
	 * 登録テスト
	 */
	@RunWith(SpringRunner.class)
	@SpringBootTest
	@TestExecutionListeners({
	    DependencyInjectionTestExecutionListener.class,
	    DbUnitTestExecutionListener.class
	})
	@DatabaseSetup("register.xlsx")
	public class register_test{
                @Before
		public void setup() {
			//毎回テスト実行時に呼ばれる
		}
		
		@After
		public void after() {
			//毎回テスト実行時に呼ばれる
		}
		@Test
		public void case1() {
		    //ここにテストコードを記載する
		}
	}
	/**
	 * 初期表示テスト
	 */
	@RunWith(SpringRunner.class)
	@SpringBootTest
	@TestExecutionListeners({
	    DependencyInjectionTestExecutionListener.class,
	    DbUnitTestExecutionListener.class
	})
	@DatabaseSetup("init.xlsx")
	public class init_test{
               @Before
		public void setup() {
			//毎回テスト実行時に呼ばれる
		}
		
		@Test
		public void case1() {
		    //ここにテストコードを記載する
		}
	}
}

もちろん@BeforeClassや@AfterClassなどもインナークラスで定義できるので定義したい処理を分ける場合にもとても役に立つ方法です。

まとめ

Enclosed.classを利用したテストクラスは、JUnitにおいてテストコードをより見やすくしたり、テストがイベントごとに定義されているような場合にはとても便利な機能です。
テストコードをわかりやすくするのは、実装後のメンテナンスにおいても大変重要になるため利用することをお勧めします。