配置同时使用PowerMock和Robolectric对Android进行单元测试
后来在PowerMock官网上找到了另外一个教程,里面说使用PowerMockRule是不靠谱的,要使用PowerMock 1.6.0引入的新的@PowerMockRunnerDelegate annotation来进行配置
具体配置文件如下:
module里面的build.gradle添加依赖:
1 dependencies { 2 ...... 3 4 testCompile "org.robolectric:robolectric:3.0" 5 testCompile 'org.mockito:mockito-core:1.10.19' 6 testCompile 'junit:junit:4.12' 7 testCompile "org.powermock:powermock-module-junit4:1.6.4" 8 testCompile "org.powermock:powermock-module-junit4-rule:1.6.4" 9 testCompile "org.powermock:powermock-api-mockito:1.6.4" 10 testCompile "org.powermock:powermock-classloading-xstream:1.6.4" 11 }
对下面的 RobolectricTest 基类进行继承,就可以正常使用PowerMock和Robolectric进行测试了
import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; /** * Base class extended by every Robolectric test in this project. * <p/> * You can use Powermock together with Robolectric. */ @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) public abstract class RobolectricTest { }
记住要import Powermock版本的mockito api,不然会出现稀奇古怪的bug。
比如
import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.spy; import static org.powermock.api.mockito.PowerMockito.when;
有时候Robolectric会提示你不能找到 Manifest.xml ,这时候一般clean project就可以了。
Robolectric 3.0 暂时不支持加载jniLibs,如果你的代码用到了jniLibs,就只能使用 Android Instrumentation Tests了,如果你像我一样 extends android.app.Application 来创建自己的Application类,并在该Application类中写了了需要调用jniLibs的代码,可以使用以下的方法在unit test中跳过这些代码。
@Override public void onCreate() { super.onCreate(); if (isJUnitTest()) { // 省略掉包含jniLibs的library的初始化 } else { // 进行正常的初始化 } } public static boolean isJUnitTest() { StackTraceElement[] stackTrace = new Throwable().getStackTrace(); for (StackTraceElement element : stackTrace) { if (element.getClassName().startsWith("org.junit.")) { return true; } } return false; }
标签:
test
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
2015-02-22 使用gcc作为编译器时,设置qt creator默认开启空白c和c++项目的c++11和c99支持