所以我有一个非常简单的类,其中包含三个公共方法。 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使用任何其他库(包装器)。我对图书馆的使用有一些限制。
谢谢。
答案 0 :(得分:0)
问题是您的DataManager类需要android Context,而Mockito却存在模拟它的问题(尽管看起来应该如此)。根据SOLID第5条原则,使用方法
创建名称为DataManager的接口fun startDataManager()
fun checkFileExists(): Boolean
fun startTask()
在某些类中实现它,并用抽象代替实现。
有了它,您可以模拟并轻松使用它。
希望会有所帮助。