#この記事の概要
eclipseでjunitを使用した際に、少し苦労したので、備忘録を兼ねて設定方法を記載します。
具体的にはテスト対象クラスにprivateコンストラクタがある際に下記エラーが発生することがあるので、その回避方法を記載します。
The constructor Empty() is not visible
[JavaのリフレクションAPIでメソッド取得、メソッド実行]
(http://pppurple.hatenablog.com/entry/2016/07/23/205446)
#環境
OS:Windows8.1 32bit
eclipse:4.5.2
#テスト対象クラス
TestTarget.java
packege com.web.test
public class TestTarget {
private TestTarget() {
//記述無し
}
private int minus(int x, int y) {
return (x - y);
}
}
#junitテストクラス
テスト対象クラスに対するjunitのテストクラスを作成
SampleTest.java
import static org.junit.Assert.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
public class SampleTest {
@Test
public void test()
throws NoSuchMethodException,
SecurityException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
{
TestTarget testTarget = new TestTarget();
Method method = Sample.class.getDeclaredMethod("minus", int.class, int.class);
method.setAccessible(true);
int actual = (int)method.invoke(testTarget, 8, 2);
assertEquals(6, actual);
}
このようにすると
The constructor Empty() is not visible
が発生したので、下記のように変更します
SampleTest.java
import static org.junit.Assert.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
public class SampleTest {
@Test
public void test()
throws NoSuchMethodException,
SecurityException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
{
//修正前
//TestTarget testTarget = new TestTarget();
//修正後
//リフレクションAPIを使用してテスト対象クラスのインスタンスを取得
TestTarget testTarget = Class.forName("com.web.test.TestTarget").newInstance();
Method method = testTarget.class.getDeclaredMethod("minus", int.class, int.class);
method.setAccessible(true);
int actual = (int)method.invoke(testTarget, 8, 2);
assertEquals(6, actual);
}
これで
The constructor Empty() is not visible
が解消されました