java - 模拟 CountDownTimer 和 Handler

标签 java android unit-testing mockito powermockito

我正在使用 模拟 PowerMockito 在 Android 上编写我的单元测试。

我已经设法处理了几乎所有的东西,但我坚持使用 CountDownTimer Handler .

我可以模拟 CountDownTimer 的子类,但我无法模拟它的 final方法喜欢 cancel() ,所以每次cancel()方法被调用,测试运行器报告一个 java.lang.RuntimeException: Method cancel in android.os.CountDownTimer not mocked. See ...
有没有人在不使用 Robolectric 的情况下有解决方案?

最佳答案

这看起来可能是您的编译结构或测试设置有问题。在问题中发布有关编译设置和测试代码的更多详细信息可能会对您有所帮助。

因为你得到的是“方法......没有被模拟”,你显然已经在使用 Android 提供的一个模拟友好的测试库。 Android SDK 的最新版本包括此 mockable Android jar ,首先包含在 Android Studio 和 Android gradle 工具链中;有了这个,所有的实现都是可模拟的,所以你不应该需要 Robolectric 甚至 PowerMockito 来继续前进。

At runtime, tests will be executed against a modified version of android.jar where all final modifiers have been stripped off. This lets you use popular mocking libraries, like Mockito.



但是,由于 javac 可以使用静态调度(即非动态或虚拟)编译对静态和 final方法的调用,您可能会发现自己无法利用这个 final -free 库,如果您针对包含 final 的 android.jar 版本编译任何中间工件或库修饰符。如果你调用了字节码中的最后一个方法,那么你唯一剩下的选择就是像 Robolectric 和 PowerMock 那样截取或重写字节码。 PowerMock 及其 PrepareForTest 注释可能很难正确处理,因此如果您尝试过该操作失败,您可能需要在此处发布您的代码以进行查看。

当然,您仍然需要负责确保您的被测系统使用新提供的模拟; PowerMock 可以拦截对构造函数的调用,并且 Robolectric 用自己的替代方法替换了整个 Android 类,但是对于纯模拟,您需要以一种或另一种方式注入(inject)该依赖项。

关于java - 模拟 CountDownTimer 和 Handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37548724/

相关文章:

java - 是否使用泛型?

java - 动态识别测试类

android - 如何将 Activity 带到前台(如果不存在则创建)?

Android:无法使用 CursorLoader 访问 ContentProvider 内的光标数据

c# - 如何在 ASP.NET Core 中对 ViewBag 进行单元测试?

java - 通配符 java 扩展

java - 我如何根据 GPS 位置在网络服务器和 Android 应用程序之间进行交互?

java - 为什么我们在弱引用对象实例(如 TextView )之后使用 get() 方法?

javascript - javascript 类的单元测试 (ES6) - stub 不起作用

unit-testing - Lisp 中破坏性函数的单元测试