我想使用使用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
}
}
}