【Junit】【Spring】privateなフィールドの値を書き換える
はじめに
お世話になります、hosochinです
今回は
「Junitでテスト対象クラスのprivateなフィールドの値を書き換える」です
やってみる
- テスト対象のクラス
@Getter
public class Sample {
private String privateFiled;
}
ReflectionTestUtilsを使う
SpringプロジェクトならReflectionTestUtilsがおすすめ
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
public class SampleTest {
@Test
void privateなフィールドを書き換える_ReflectionTestUtils() {
// テスト対象のクラス
Sample target = new Sample();
// 値を書き換え
ReflectionTestUtils.setField(target, "privateFiled", "値を書き換え");
// 結果
System.out.println(target.getPrivateFiled());
}
}
Whiteboxを使う
mockitoのWhiteboxを使った方法です
import org.junit.jupiter.api.Test;
import org.mockito.internal.util.reflection.Whitebox;
public class SampleTest {
@Test
void privateなフィールドを書き換える_Whitebox() {
// テスト対象のクラス
Sample target = new Sample();
// 値を書き換え
Whitebox.setInternalState(target, "privateFiled", "値を書き換え");
// 結果
System.out.println(target.getPrivateFiled());
}
}
リフレクションで書く
モックライブラリを使わずに実現する方法です
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
public class SampleTest {
@Test
void privateなフィールドを書き換える_リフレクション() throws Exception {
// テスト対象のクラス
Sample target = new Sample();
// private変数のフィールドを取得
Field field = target.getClass().getDeclaredField("privateFiled");
// private変数へのアクセス制限を解除
field.setAccessible(true);
// 値を書き換え
field.set(target, "値を書き換え");
// 結果
System.out.println(target.getPrivateFiled());
}
}
JMockitを使う
こちらはDeencapsulationというクラスのsetFiledメソッドを使う方法
ただしバージョン1.47でDeencapsulationが廃止されているため注意
JMockit – Development history
import org.junit.jupiter.api.Test;
public class SampleTest {
@Test
void privateなフィールドを書き換える_jmockit() {
// テスト対象のクラス
Sample target = new Sample();
// 値を書き換え
Deencapsulation.setField(target, "privateFiled" ,"値を書き換え");
// 結果
System.out.println(target.getPrivateFiled());
}
}
ディスカッション
コメント一覧
まだ、コメントがありません