public한 녀석은 테스트할 수 있는데 private 같은 소심한 녀석은 테스트 가능할까?

leverest96·2023년 1월 13일
0

Trouble Shooting

목록 보기
11/20
post-thumbnail

문제 원인

아무래도 public한 녀석만을 테스트하다가 private한 녀석은 테스트를 하지 못해서 아쉬움이 남았다. 근데 해결할 방법이 있다니!

해결 방법

  1. private 메서드를 가지고 있는 클래스를 생성해준다.
  2. 이후 사용하고자 하는 private 메서드를 호출하기 위해 Method 클래스를 만들어준다.
    • Method method = (Private 메서드를 가지는 클래스).getClass().getDeclaredMethod("메서드명", 파라미터1, 파라미터2);
    • 이때 파라미터1,2는 해당 메서드에 파라미터가 존재한다면 그 타입에 맞는 파라미터.class를 해준다.
  3. 이제 Private 메서드를 Method 객체에 담아냈으니 접근 허용가능하도록 만들어준다.
  4. 마지막으로 invoke를 통해 메서드를 실행해주도록 한다.
    • (형 변환) method.invoke(Private 메서드를 가진 클래스명, 실제 파라미터1, 실제 파라미터2);
  • 참고한 블로그의 예시

    JUnitTestClass jUnitTestClass = new JUnitTestClass();
    
    Method method = jUnitTestClass.getClass().getDeclaredMethod("add", int.class, int.class);
              method.setAccessible(true);
              
    int ret = (int) method.invoke(jUnitTestClass, 1,2);
  • 프로젝트의 예시

    public static final String METHOD_NAME = "createProfile";
    
    private OAuth2AuthenticationSuccessHandler oAuth2AuthenticationSuccessHandler;
    
    private Method createProfileMethod;
    
    private AwsStorageProperties awsStorageProperties;
    
    @BeforeEach
    void beforeEach() throws Exception {
    		  awsStorageProperties = new AwsStorageProperties(FactoryPreset.STORAGE);
    
    		  oAuth2AuthenticationSuccessHandler = new OAuth2AuthenticationSuccessHandler(
                    null, profileRepository, null, null, awsStorageProperties);
    
    		  createProfileMethod = oAuth2AuthenticationSuccessHandler.getClass().getDeclaredMethod(METHOD_NAME);
    
    		  createProfileMethod.setAccessible(true);
    }

추가 케이스(변수)

  1. 이번에는 Field를 생성하고 내가 얻고자하는 변수명을 입력해준다.
  2. 이제 해당 변수를 field에 담았으니 접근 가능하게 만든다.
  3. 그 후 field.get(생성한 클래스명)을 통해 얻고자했던 private value를 얻어주면 된다.
  • 예시

    JUnitTestClass jUnitTestClass = new JUnitTestClass();
    
    Field field = jUnitTestClass.getClass().getDeclaredField("myVariable");
    field.setAccessible(true);
    
    int value = (int)field.get(jUnitTestClass);

https://www.crocus.co.kr/1665

profile
응애 난 애기 개발자

0개의 댓글