【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());
    }
}

技術junit,spring

Posted by hosochin