private,protectedメソッドのテスト方法

2022/04/02に公開約2,400字

概要

privateメソッドやprotectedメソッドはテストクラスで生成したインスタンスからは呼び出すことができない。
リフレクションと呼ばれる方法を使って呼び出します。
処理の流れ

  1. Method型の変数にprivate,protectedメソッドを宣言する
  2. Method変数のアクセス制限を変更
  3. メソッド実行

ソースコード

SampleClass1.java
public class SampleClass1 {
    
    protected boolean callProtec(String str) {
        if(str != null) {
            System.out.println("protectedメソッドを呼び出し:" + str);
            return true;
        } else {
            return false;
        }
    }
    
    private boolean callPri(String str) {
        if(str != null) {
            System.out.println("privateメソッドを呼び出し:" + str);
            return true;
        } else {
            return false;            
        }
    }
}
SampleClass1Test.java
@SpringJUnitConfig
@SpringBootTest
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })
public class SampleClass1Test {

    @Test
    public void callProtecTest() {
        SampleClass1 sampleClass1 = new SampleClass1();
        Method method;
        try {
            method = SampleClass1.class.getDeclaredMethod("callProtec", String.class);
            method.setAccessible(true);
            boolean flg = (boolean)method.invoke(sampleClass1, "testStr!");
            assertEquals(flg,true);
        } catch (NoSuchMethodException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch(InvocationTargetException e) {
            
        } catch(IllegalAccessException e) {
            
        }
    }
    
    @Test
    public void callPriTest() {
        SampleClass1 sampleClass1 = new SampleClass1();
        Method method;
        try {
            method = SampleClass1.class.getDeclaredMethod("callPri", String.class);
            method.setAccessible(true);
            boolean flg = (boolean)method.invoke(sampleClass1, "testStr2!");
            assertEquals(flg,true);
        } catch (NoSuchMethodException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch(InvocationTargetException e) {
            
        } catch(IllegalAccessException e) {
            
        }
    }
}

git

https://gitlab.com/nk19940709nk/nakaiproject/-/tree/main/ZennProject/src

Discussion

ログインするとコメントできます