gpt4 book ai didi

java - 模拟 Locale.forLanguageTag

转载 作者:行者123 更新时间:2023-12-02 06:18:16 25 4
gpt4 key购买 nike

我正在尝试对一个方法进行单元测试

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;
}

为了测试我需要模拟 java.util.Locale 。我正在使用 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.MissingResourceException来自java.util.Locale.getISO3Language (我想 mock 它)。如何解决这个问题?

最佳答案

一种方法(忽略当前错误的原因)是将 Locale 对象包装在可以正确模拟的外观中。然后可以将该对象作为字段/构造函数参数传递到您的类中。

例如

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)
}

然后在您的测试用例中,您可以在构造 Context 对象之前模拟 LocalResolver

我总是更喜欢这样的方法,而不是尝试模拟具体的类。它通常具有的好处不仅仅是易于测试。

关于java - 模拟 Locale.forLanguageTag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com