javaではUtilクラスなどのコンストラクタは無駄なインスタンス化を抑制するためにコンストラクタの修飾子をprivateにする事がよくあります。ただdjUnitで試験する場合にはコンストラクタを呼び出したくても修飾子がprivateになっていてはインスタンス化が出来ずに呼び出せないのでカバレッジを100%に出来ません。そういう場合にプライベートコンストラクタをテストする方法についてメモしておきます。
Javaソース
1 2 3 4 5 6 7 8 9 10 11 |
public class UtilSample1{ /** * <p>[概 要] コンストラクタ</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ private UtilSample1() { // 処理なし } } |
JUnitサンプル
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 |
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.junit.Test; public class UtilSample1Test { @Test public void testConstructor() { try { // 準備 Class<?> utilSample1 = Class.forName("UtilSample1"); Constructor<?>[] constructor = utilSample1.getDeclaredConstructors(); constructor[0].setAccessible(true); // 実行 Object object = constructor[0].newInstance(); // 検証 assertNotNull("オブジェクトがありません。",object); assertThat(object, instanceOf(UtilSample1.class)); } catch (ClassNotFoundException e) { // 指定されたクラスが存在しない場合 fail(e.getMessage()); } catch (IllegalArgumentException e) { // 不正な引数、または不適切な引数をメソッドに渡した場合 fail(e.getMessage()); } catch (InstantiationException e) { // インスタンスを生成できない場合 fail(e.getMessage()); } catch (IllegalAccessException e) { // 配列以外のインスタンス作成、フィールドの設定または取得、メソッドの呼び出しを試みた場合 fail(e.getMessage()); } catch (InvocationTargetException e) { // 呼び出されるメソッドまたはコンストラクタがスローする例外をラップする、チェック済み例外 fail(e.getMessage()); } } } |