【发布时间】: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 context或file does not exist失败 -
@r2rek 是的,先生,我仔细检查并更改为
Mockito.mock(...,但结果是一样的。我正在使用 Mockito 3.1.0 版
标签: android unit-testing kotlin mockito androidx