【发布时间】:2018-04-29 11:42:56
【问题描述】:
第一次进行单元测试,并使用 Mockito。我不确定我是否正在考虑正确测试它。情况如下:
在我的 Android 应用中,我使用的是 Model-View-Presenter。我正在尝试在我的演示者类中测试一个名为 validateCredential(serviceManager: ServiceManager, email: String, password: String) 的方法,以查看我传递给它的服务管理器是否最终会通过使用 mockito 进行验证来调用回调(该方法由视图调用)。
// method in presenter class
override fun validateCredential(serviceManager: ServiceManager, email: String, password: String) {
loginModel = LoginModel(email, password)
serviceManager.getParent(email, password)
serviceManager.execute()
}
// callback implemented by presenter class
private fun handleLoginResult(result: ServiceManager.RequestResult, data: ByteArray, responseCode: Int, optionalParam: String) {
...
mView.startHomeScreen()
}
presenter 类还实现了一个回调接口 (IServiceAsyncTaskCallback),该接口提供给 serviceManager 的构造函数。我想要在这个特定的单元测试中验证是否调用了 mView.startHomeScreen()。
问题:
- Android 单元测试似乎需要对 ServiceManager 进行模拟(ServiceManager 扩展抽象类 AsyncTask),因为当我调用
execute()时,如果没有模拟,Android 单元测试库会抛出异常。 - 但是,如果我模拟 ServiceManager,我无法向构造函数提供两个必要的参数,如果我正确理解单元测试,则应该模拟这些参数。构造函数的两个参数是一个接口回调(也就是presenter类),以及一个负责通过http发送JSON的类对象。这两个都应该被嘲笑,对吗?因为在单元测试中,您不希望这些依赖项实际进行 HTTP 调用或调用回调,对吧?
- 看来我想多了。我真正想要的是查看传递给演示者的视图对象是否调用
startHomeScreen(),所以我真的应该忘记测试validateCredentialMethod(),直接调用handleLoginResult(...)。这比上面的路线好吗? - 然而,另一个问题是即使我直接调用
handleLoginResult(...)来测试是否调用了传递给presenter的模拟视图,该方法代码包含对Android相关代码JSONObject的调用,并且由于它属于android.jar 文件,它会抛出异常,因为它没有被模拟!我也应该为此提供注射吗?!
我不知道如何测试这个。验证模拟视图是否调用了startHomeScreen() 的正确方法是什么?
【问题讨论】:
-
刚刚发布了一个答案...如果这回答了您的问题,您可能需要编辑标题,因为我认为它不能反映您的实际问题
标签: java android unit-testing kotlin mockito