是的,Dagger 就是答案。关于如何实现这一点,我建议在Github 上查看 Jake Wharton 的 u2020。简而言之,您为生产和调试风格提供不同的 API 实现。或者,您可以对集成测试有不同的风格。
在没有 Dagger 的情况下解决这个问题的另一种方法(添加对它的支持对于正在进行的项目来说是一项艰巨的任务),那就是对集成测试进行一些尝试。例如。拥有release、debug 和mock 口味。
然后,您可以在 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
main/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
}
}
}