【问题标题】:Mocking Locale.forLanguageTag [duplicate]模拟 Locale.forLanguageTag [重复]
【发布时间】:2014-01-21 12:28:59
【问题描述】:

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

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.Locale.getISO3Language(我想模拟)得到一个java.util.MissingResourceException。怎么解决?

【问题讨论】:

    标签: java unit-testing mockito junit4 powermock


    【解决方案1】:

    一种方法(忽略当前错误的原因)是将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

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

    【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2017-09-19
    • 2018-12-08
    • 2013-06-06
    • 2013-09-20
    • 2011-12-31
    相关资源
    最近更新 更多