2014-01-21 2 views
0

내가 단위 테스트에 내가 java.util.Locale을 조롱하는 데 필요한 테스트하려면비웃음 Locale.forLanguageTag

public static Context fromLanguageTag(final String languageTag) { 
    final Context context = new Context(); 
    final Locale locale = Locale.forLanguageTag(languageTag); 
    context.language = locale.getLanguage().length()==3 ? locale.getLanguage() : locale.getISO3Language(); 
    return context; 
} 

을하는 방법을 시도하고있다. 내가 PowerMock 및 Mockito 사용하고 있습니다 :

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Locale.class }) 
public class ContextTest { 
    public void testFromLanguageTag() throws Exception { 
     mockStatic(Locale.class); 
     final Locale mockLocale = mock(Locale.class); 
     when(mockLocale.getLanguage()).thenReturn(LANGUAGE_3_OUTPUT); 
     when(mockLocale.getISO3Language()).thenReturn(LANGUAGE_ISO); 
     when(Locale.forLanguageTag(Mockito.eq(LANGUAGE_TAG_LONG_INPUT))).thenReturn(mockLocale); 
     final Context c = Context.fromLanguageTag(LANGUAGE_TAG_LONG_INPUT); 
     assertThat(c.getLanguage()).isEqualTo(LANGUAGE_3_OUTPUT); 
    } 
} 

을하지만 조롱 메서드가 호출되지 않습니다 mockLocale에서 호출 것 같다; 대신 나는 java.util.Locale.getISO3Language (나는 조롱하고 싶다)에서 java.util.MissingResourceException을 얻는다. 어떻게 해결할 수 있습니까?

답변

2

하나의 접근법 (현재 오류의 원인을 무시함)은 올바르게 모의 할 수있는 모양으로 Locale 객체를 포장하는 것입니다. 그런 다음이 객체를 필드/생성자 -param으로 클래스에 전달할 수 있습니다.

예. 당신이 당신의 Context 객체를 생성하기 전에

public interface LocaleResolver {  
    // add signatures for the methods you care about in Locale (only) 
} 

public class PlatformLocaleResolver implements LocaleResolver { 
    // delegate all methods to the corresponding `Locale` methods 
} 

public class Context { 
    // take LocaleResolver in constructor 
    // (or, if preferred, expose a setter to adjust a class field) 
} 

그런 다음 테스트 케이스에, 당신은 LocalResolver을 조롱 할 수 있습니다.

필자는 항상 구체적인 클래스를 모방하는 대신이 방법을 선호합니다. 그것은 종종 테스트의 용이함을 넘어서는 이점을 가지고 있습니다.

+0

제 경우의 해결책은 [시스템 속성을 가져 오는 모의 시스템 클래스] (http://stackoverflow.com/a/20408354)입니다. –