【问题标题】:Mock Locale using Mockk使用 Mockk 模拟语言环境
【发布时间】:2021-03-19 22:24:39
【问题描述】:

我正在尝试使用Mockk 来模拟对Locale.getDefault() 的调用,但我似乎无法让它工作。有没有人成功使用Mockk模拟Locale

我的非常简单的测试类

@Test
fun testName() {
    val defaultLocale = mockk<Locale>()

    mockkStatic(Locale::class)

    every { Locale.getDefault() } returns defaultLocale
}

我得到的错误

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844

【问题讨论】:

    标签: android mockk


    【解决方案1】:

    不需要模拟 Locale,因为它是 Java 框架的一部分,并且可以在单元测试中运行而不会出现问题。

    package java.util.Locale.java
    

    如果您正在测试各种语言环境,您可以在每次测试运行之前设置所需的语言环境,方法是使用 Locale 类中的预定义国家常量之一调用 Locale#setDefault 或在构造函数中输入语言和国家代码字符串:

    setDefault(Locale.US) 
    setDefault(Locale.GERMANY)
    setDefault(Locale.FRANCE)
    
    // with a language code
    val locale = Locale("en-US")
    
    // with a language and country code
    val locale = Locale("en", "US") 
    
    Locale.setDefault(locale)
    

    重要

    您应该在每个测试类完成后重置语言环境,以确保语言环境处于即将运行的下一个测试的预期状态。这可以通过存储类输入的语言环境并在所有测试运行后恢复到它来维护,@BeforeClass@AfterClass JUnit 方法注释在类测试运行之前运行一次,在所有测试运行后运行一次.

    private lateinit var storedLocale: Locale
    
    @BeforeClass
    fun beforeClass() {
        storedLocale = Locale.getDefault()
    }
    
    ..
    // various tests that manipulate the default locale
    ..
    
    @AfterClass
    fun afterClass() {
         Locale.setDefault(storedLocale)
    }
    

    【讨论】:

    • 我认为正确的格式是Locale("en", "US")
    • 我的答案中的示例将语言代码作为参数传递给 Locale 构造函数,该构造函数又调用您提到的构造函数。关于测试语言环境,两者都可以正确使用,具体取决于您是否通过了语言代码或语言和国家/地区。我将在我的答案中添加更多示例..
    • 尽管这个答案没有直接回答问题,但我同意不应嘲笑 Locale 并且我们应该使用现有的 Locale 的建议,例如 Locale.US
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多