我的模拟自定义类中的Mockito不模拟方法[Kotlin-Android]

时间:2019-11-07 08:39:32

标签: android unit-testing kotlin mockito androidx

所以我有一个非常简单的类,其中包含三个公共方法。 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
    }
}

因此,这里的重点是检查当我从外部调用checkFileExists方法时是否调用了startDataManager方法。这就是我尝试模拟所有内容的方式:

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

    dataManagerMock.startDataManager()

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

因此,当我运行此测试时,收到关于context方法内的checkFileExists()的错误,是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使用任何其他库(包装器)。我对图书馆的使用有一些限制。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题是您的DataManager类需要android Context,而Mockito却存在模拟它的问题(尽管看起来应该如此)。根据SOLID第5条原则,使用方法

创建名称为DataManager的接口
fun startDataManager()
fun checkFileExists(): Boolean 
fun startTask()

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

有了它,您可以模拟并轻松使用它。

希望会有所帮助。