【问题标题】:Mockito not mocking method from my mocked custom class [Kotlin - Android]Mockito 没有从我的模拟自定义类中模拟方法 [Kotlin - Android]
【发布时间】:2019-11-07 08:39:32
【问题描述】:

所以我有一个非常简单的类,其中包含三个公共方法。 On 调用返回 Boolean 的另一个。该类如下所示:

open class DataManager(var context: Context) {

    fun startDataManager(){
        if(checkFileExists()){
            startTask()
        }
    }

    fun checkFileExists(): Boolean {
        val mFile: File = context.getDatabasePath("FILE_NAME")
        return mFile.exists()
    }

    fun startTask(){
        //TODO Task here
    }
}

所以这里的重点是检查当我从外部调用startDataManager 方法时是否调用了方法checkFileExists。这就是我试图模拟一切的方式:

@Test
fun checkFileExists_onDataManagerStart(){
    val dataManagerMock = mock(DataManager::class.java)
    `when`(dataManagerMock.checkFileExists()).thenReturn(true)

    dataManagerMock.startDataManager()

    verify(dataManagerMock, times(1)).checkFileExists()
}

所以当我运行这个测试时,我收到一个关于 checkFileExists() 方法中的 context 的错误是 null 并且它无法检查真实文件是否存在。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference at
.data.DataManager.checkFileExists(DataManager.kt:20)

就我对 Mockito 的理解而言,当我模拟我的课程时,它也应该模拟方法。然后,我为要测试的方法强制使用return true,因此当我调用它时,它不应该在该方法中运行真实代码。 是吗?我在那里错过了什么?

如果可能的话,我不希望为 Mockito 使用任何其他库(包装器)。我对库的使用有一些限制。

提前谢谢你。

【问题讨论】:

  • 当你想测试一个类时你不要mock它。如果您需要替换类中的方法,通常的建议是重构您的代码。如果您不能这样做,请考虑使用spy
  • 如果你创建一个mock,所有的方法默认什么都不做,如果他们必须返回一些东西,那么它返回相关类的通常的默认值(null或它们的原始对应物) .
  • 你确定你使用的是 Mockito 的mock :)?
  • @second 这就是我想说的。但它没有按预期工作。正如您在我的代码中看到的那样,当我调用startDataManager 时,它也应该调用checkFileExists 并返回true,但它却以null contextfile does not exist 失败
  • @r2rek 是的,先生,我仔细检查并更改为Mockito.mock(...,但结果是一样的。我正在使用 Mockito 3.1.0 版

标签: android unit-testing kotlin mockito androidx


【解决方案1】:

问题是你的 DataManager 类需要 android Context 并且 Mockito 有一个问题来模拟它(尽管它看起来应该这样)。根据 5th SOLID 的原则,用方法创建名为 DataManager 的接口

fun startDataManager()
fun checkFileExists(): Boolean 
fun startTask()

在某个类中实现它并用抽象代替实现。

有了这个,你可以轻松地模拟和使用它。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2023-04-08
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多