Java_UT_Mock 시리즈 의 - 04 Powermock 과 단일 모드
단일 모델 은 흔히 볼 수 있 는 창설 형 디자인 모델 로 이 모델 의 클래스 를 사용 하 는 실례 의 전역 유일 성 을 확보한다.그러나 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 의 난점 은
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 으로 돌아 가 는 것 을 실현 합 니 다. 즉, 단일 모드 에 대한 시 뮬 레이 션 을 실현 합 니 다.