【问题标题】:Injecting mock Retrofit API service instance into ActivityInstrumentTestCase2将模拟改造 API 服务实例注入 ActivityInstrumentTestCase2
【发布时间】:2014-10-18 23:38:33
【问题描述】:

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

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

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

如何换入模拟 Retrofit API 服务?也许匕首就是答案?

【问题讨论】:

标签: android functional-testing retrofit dagger android-espresso


【解决方案1】:

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

在没有 Dagger 的情况下解决这个问题的另一种方法(添加对它的支持对于正在进行的项目来说是一项艰巨的任务),那就是对集成测试进行一些尝试。例如。拥有releasedebugmock 口味。

然后,您可以在 Android Manifest 中为 mock 风格设置不同的 Application 类 - 使用模拟适配器的实现。这里的核心思想是你可以覆盖或增加你的主要 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

ma​​in/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
        }
    }
}

【讨论】:

  • 谢谢你!我没有意识到您可以在AndroidManifest 中指定不同的Application。您能否简要介绍一下如何执行此操作?
  • 添加了示例——我想到的伪代码,但你应该明白要点。稍后我敦促您查看 u2020 - 使用 Dagger 的更优雅的解决方案。但是,一旦你开始使用它,就不会再回来了;)
猜你喜欢
  • 2015-10-25
  • 2013-01-24
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多