我正在使用Mockito和PowerMockito在Android上编写单元测试。
我已经设法处理了几乎所有的备份内容,但我被CountDownTimer
和Handler
卡住了。
我可以模拟CountDownTimer
的一个子类,但我不能模拟它的最终方法(如cancel()
),因此每次调用cancel()
方法时,测试运行程序都会报告一个java.lang.RuntimeException: Method cancel in android.os.CountDownTimer not mocked. See ...
有人能在不使用Robolectric的情况下解决这个问题吗
这看起来可能是编译结构或测试设置的问题在您的问题中发布更多关于编译设置和测试代码的详细信息可能会对您有所帮助
因为你得到了"Method…not mock",你显然已经在使用Android提供的模拟友好测试库。最新版本的Android SDK包括这个可模拟的Android jar,它首先包含在Android Studio和Android gradle工具链中;有了这个,所有的实现都是可模拟的,所以你不应该需要Robolectric甚至PowerMockito来前进。
在运行时,测试将针对android.jar的修改版本执行,其中所有
final
修饰符都已被剥离。这使您可以使用流行的嘲讽库,如Mockito。
但是,因为javac可以使用静态调度(即不是动态或虚拟的)编译对静态和最终方法的调用,所以如果您针对确实包含final
修饰符的android.jar版本编译任何中间工件或库,您可能会发现自己无法利用这个不含final
的库。如果你有对字节码中最后一个方法的调用,那么你剩下的唯一选择就是像Robolectric和PowerMock那样拦截或重写字节码。PowerMock及其PrepareForTest注释可能很难正确,所以如果你尝试过,但没有成功,你可能想在这里发布你的代码。
当然,您仍将负责确保您的测试系统使用新提供的mock;PowerMock可以拦截对构造函数的调用,Robolectric用自己的替代方案替换了整个Android类,但对于纯mock,您需要以某种方式注入这种依赖关系。
将此行添加到模块build.gradle
android {
...
testOptions {
unitTests.returnDefaultValues = true
} }