android – 将模拟Retrofit API服务实例注入ActivityInstrumentTestCase2

我想使用使用MockRestAdapter(https://github.com/square/retrofit/blob/master/retrofit-mock/src/main/java/retrofit/MockRestAdapter.java)创建的模拟Retrofit API服务实例,使用Espresso为Activity编写功能测试.

这有点棘手,因为你无法通过Activity的构造函数注入任何依赖项.

目前,单个Retrofit API服务实例存在于我的Application对象中,我在每个Activities的onCreate()方法中创建了对它的引用.

如何交换模拟Retrofit API服务?也许Dagger就是答案?

解决方法:

是的,Dagger就是答案.关于如何实现这一点,我建议在Github查看Jake Wharton的u2020.简而言之,您为生产和调试风格提供了不同的API实现.或者,您可以为集成测试提供单独的风格.

在没有Dagger的情况下解决这个问题的另一种方法(增加对它的支持对于正在进行的项目来说将是一项非常艰巨的任务),将会有一种集成测试的风格.例如.有发布,调试和模拟口味.

然后你可以在Android Manifest中设置一个不同的Application类来设置mock风格 – 一个使用模拟适配器的实现.这里的核心思想是你可以在各种风格中覆盖或扩充主AndroidManifest.

那大概是这样的:

项目结构

app/
    src/
       main/
           AndroidManifest.xml - Activities, services, permissions - all the stuff goes here 
           java/.../MyApplication.java
       mock/
           AndroidManifest.xml - example below
           java/.../MockApplication.java
       debug/    - Not relevant for this example
       release/  - Not relevant for this example

主/ AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.android" >

    <!-- Permissions etc -->

    <application
        android:name=".MyApplication"
        ...
        >

        <!-- Activities, services etc -->

    </application>
</manifest>

模拟/ AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name=".MockApplication"/>
</manifest>

Application.java

public class MyApplication extends Application {

    @Override public void onCreate(Bundle savedState) {
        MyApi api = createApiAdapter();
    }

    protected MyApi createApiAdapter() {
        // Create regular Retrofit adapter
    }

}

MockApplication.java

public class MockApplication extends MyApplication {

    @Override protected MyApi createApiAdapter() {
        // Create mock Retrofit adapter
    }

}

的build.gradle

android {

    // ...

    buildTypes {
        mock {
            applicationIdSuffix '.mock'
            versionNameSuffix '-mock'
            debuggable true
        }
        debug {
            applicationIdSuffix '.dev'
            versionNameSuffix '-dev'
            debuggable true
        }
        release {
            signingConfig signingConfigs.release
        }
    }
}
上一篇:android – 使用Retrofit进行连续的api调用并返回observable


下一篇:android – 如何在Retrofit中使用Protobuf转换器