模拟 CountDownTimer 和 Handler

Hug*_*sse 5 java android unit-testing mockito powermockito

我正在使用MockitoPowerMockito在 Android 上编写我的单元测试。

我已经成功地处理了几乎所有的 back 东西,但我坚持使用CountDownTimerand Handler

我能嘲笑的一个子类CountDownTimer,但我不能嘲笑它的最后一个方法一样cancel(),所以每次cancel()方法被调用,测试运行报告java.lang.RuntimeException: Method cancel in android.os.CountDownTimer not mocked. See ...

有没有人在不使用 Robolectric 的情况下对此有解决方案?

Jef*_*ica 0

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


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

在运行时,将针对 android.jar 的修改版本执行测试,其中所有final修饰符均已被删除。这使您可以使用流行的模拟库,例如 Mockito。

final但是,由于 javac 可以使用静态分派(即不是动态或虚拟)来编译对静态和最终方法的调用,因此如果您针对 Android 版本编译任何中间工件或库,您可能会发现自己无法利用此免费库。包含修饰符的jar final。如果您调用了字节码中的最终方法,那么您唯一剩下的选择就是像 Robolectric 和 PowerMock 那样拦截或重写字节码。PowerMock 及其PrepareForTest 注释可能很难正确使用,因此如果您尝试过但不成功,您可能需要在此处发布您的代码以供查看。

当然,您仍然有责任确保您的测试系统使用新提供的模拟;PowerMock 可以拦截对构造函数的调用,Robolectric 用自己的替代方案替换整个 Android 类,但使用纯模拟,您需要以一种或另一种方式注入该依赖项。