Java_UT_Mock 시리즈 의 - 04 Powermock 과 단일 모드

2994 단어
테스트 필드
단일 모델 은 흔히 볼 수 있 는 창설 형 디자인 모델 로 이 모델 의 클래스 를 사용 하 는 실례 의 전역 유일 성 을 확보한다.그러나 UT 의 경우 클래스 의 생 성 과정 을 차단 하기 때문에 testability 는 논의 할 필요 가 있다.다음 사례 와 같이
public class ClassToUseSingleton {
    public String invokeSingleton()
    {
        return Singleton.getInstance().printHelloWorld( "Hi!!!" );
    }
}

상기 테스트 에 응 용 된 invoke Singleton 방법 은 하나의 Singleton 단일 사례 류 의 방법 으로 특정한 작업 을 완성 했다.이 사례 류 의 소스 코드 는 다음 과 같다.
public class Singleton
{
    public String printHelloWorld( String value )
    {
        StringBuilder stringBuilder
            = new StringBuilder( "The string value is: " );
        return stringBuilder.append( value ).toString();
    }

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

Mock 실현
상기 코드 를 관찰 한 결과 mock 의 난점 은
  • 사유 내부 클래스 의 이 단일 모드 는 내부 클래스 의 방식 인 Singleton Instance 를 채택 하여 사유 적 이 고 final 인 Singleton 대상 의 실례 를 소지 함으로써 Singleton 실례 의 전역 유일 성 을 확보 하고 라인 이 안전 하 다.private static final Singleton INSTANCE
  • 정적 방법 / 변수 getInstance () 는 정적 방법 으로 new 방식 으로 mock 대상 을 주입 하 는 방법 을 사용 할 수 없습니다.Powermock 을 통 해 상술 한 문 제 를 해결 할 수 있다.getInstance () 방법 을 호출 할 때 mock 에 의 해 실 행 된 Singleton 인 스 턴 스 를 되 돌려 Singleton 인 스 턴 스. INSTANCE 호출 을 바 꾸 는 것 이 주 된 사고 입 니 다.예시 코드 는 다음 과 같다
  • import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.Mockito;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    import org.powermock.reflect.Whitebox;
    import static org.junit.Assert.assertEquals;
    @RunWith( PowerMockRunner.class )
    @PrepareForTest(Singleton.class )
    public class ClassToUseSingletonTest
    {
        @Test
        public void testSingeton() throws Exception {
        Singleton mockSingleton =  PowerMockito.mock(Singleton.class);
            Class clazz = Whitebox.getInnerClassType(Singleton.class, "SingletonInstance");
            Whitebox.setInternalState(clazz, "INSTANCE", mockSingleton);
            PowerMockito.when( mockSingleton.printHelloWorld( Mockito.anyString() ) )
                        .thenReturn( "Mocked!!" );
            assertEquals( "Mocked!!",
                          new ClassToUseSingleton().invokeSingleton() );
        }
    }
    

    사례 분석
    이곳 은 주로 화이트 박스 라 는 도 구 를 사 용 했 는데,
    Class clazz = Whitebox.getInnerClassType (Singleton.class, "SingletonInstance");
    

    이 코드 를 통 해 내부 클래스 싱글 톤 인 스 턴 스 를 가 져 왔 습 니 다.그리고 mockSingleton 을 내부 개인 변수 인 "INSTANCE" 에 부여 합 니 다.
    Whitebox.setInternalState(clazz, "INSTANCE", mockSingleton);
    

    이렇게 해서 싱글 톤 인 스 턴 스. 인 스 턴 스 를 호출 할 때 mock 에 의 해 작 동 된 싱글 톤 대상 mock Singleton 으로 돌아 가 는 것 을 실현 합 니 다. 즉, 단일 모드 에 대한 시 뮬 레이 션 을 실현 합 니 다.

    좋은 웹페이지 즐겨찾기