【问题标题】:Testing class by mocking getter通过模拟 getter 测试类
【发布时间】:2019-04-16 10:21:52
【问题描述】:

我尝试测试一个类,它作为两个具有 getter 的属性,其中一个 getter 调用静态方法。我想用静态方法模拟 getter 来测试另一个 getter 的解析逻辑。问题是无法通过 getter 访问变量,从而调用 mock。

我在 kotlin 文档中搜索了 getter 和 setter,但没有找到解决方案。

class ClassToTest() {
    val firstname: String
        get() = this.fullName.split(" ")[0]

    val fullName: String
        get() = SomeService.getFullName()
}
class ClassToTestTest() {
    fun `firstname should return first part of the fullName`() {
        val classToTestMock = mock<ClassToTest>()
        `when`(classToTestMock.fullName).thenReturn("Walter White")
        assertEquals(classToTestMock.firstname, "Walter)
    }
}

我希望让“Walter”回来,但 ClassToTest.firstName 直接访问变量而不是模拟的 getter。

有人能指出我正确的方向吗? :D

提前致谢。

【问题讨论】:

  • 那么它会返回什么?
  • 由于它不使用 getter 模拟并直接访问变量,它尝试调用返回空字符串的静态方法,因此 assertEquals 失败。
  • 如果使用get() = 声明了val,则不会引入实际的支持字段(变量)。您可以检查字节码以确保
  • 仅限getFullName() 方法
  • 实际上,我看到了when(classToTestMock.name) stubs name 属性,但没有看到fullName

标签: unit-testing testing kotlin junit mockito


【解决方案1】:

据我了解,您正在尝试测试您的 firstname 计算属性。为此,您需要打开您的课程和 fullName 属性。

open class ClassToTest() {
    val firstname: String
        get() = this.fullName.split(" ")[0]

    open val fullName: String
        get() = SomeService.getFullName()
}

Mock 只能与 open(在 Java 中不是 final)实体一起使用。否则会在运行时抛出异常。

然后,要设置您的测试类,只需调用以下代码:

`when`(classToTestMock.fullName).thenReturn("Walter White")

附:我在你的课堂上看不到字段name,所以我将其替换为fullName。如果我错过了什么,我希望你能明白这一点。

【讨论】:

  • 是的,你是对的 name 应该是 fullName。我在我的帖子中修复了它。非常感谢你的作品!不知道有 open 关键字。
猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 2017-05-23
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多