将模拟对象提供给另一个模拟对象构造函数



第一次单元测试,并使用Mockito。我不确定我是否在考虑正确地测试这个。情况如下:

在我的Android应用程序中,我使用的是模型视图演示器。我正在尝试测试演示程序类中名为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,我就不能为它提供两个必要的参数给构造函数,如果我正确理解单元测试,这应该被模拟。构造函数的两个参数是一个接口回调(即呈现器类)和一个负责通过http发送JSON的类对象。这两者都应该被嘲笑,对吗?因为在单元测试中,您不希望这些依赖项实际进行HTTP调用或回调,对吧
  • 看来我想得太多了。我真正想要的是看看传递给演示者的视图对象是否调用了startHomeScreen(),所以我真的应该忘记测试validateCredentialMethod(),直接调用handleLoginResult(...)。这比上面的路线好吗
  • 然而,另一个问题是,即使我直接调用handleLoginResult(...)来测试是否调用了传递给演示者的mock视图,该方法代码也包含对JSONObject的调用,这是一个与Android相关的代码,并且由于它属于Android.jar文件,它会抛出异常,因为它没有被嘲笑!我也应该为此注射吗

我不知道如何测试它。验证mock视图是否已调用startHomeScreen()的正确方法是什么?

问题是您试图在一个单元测试中测试两个独立的类,这使得它不是单元测试。

根据您当前的设置,您似乎希望在2个不同的类中有3个不同的测试用例(编名称,尽量明确其内容):

  • 演示者测试

    • 测试ServiceManager在验证凭据时异常
    • 当处理登录结果时调用启动主页屏幕的测试
  • ServiceManager测试

    • testCallbackIsCalledOnExccuted

相关内容

  • 没有找到相关文章

最新更新