• 配置同时使用PowerMock和Robolectric对Android进行单元测试


    Robolectric官网上给了一个配置教程,但是我使用它的方法进行配置,发现使用Mockito.spy函数的时候会出现Exception。
    后来在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;
    }
  • 相关阅读:
    H5项目开发分享——用Canvas合成文字
    《JavaScript设计模式 张》整理
    Linux常用指令指南,终端装逼利器
    飞起来的正则表达式
    JavaScript特性(attribute)、属性(property)和样式(style)
    使用 Nginx 提升网站访问速度
    centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课
    用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面
    mysql字符集调整总结
    因为smb和nfs挂掉导致客户端开机启动不了
  • 原文地址:https://www.cnblogs.com/cmicat/p/5206835.html
Copyright © 2020-2023  润新知