是的,匕首就是答案。关于如何实现这一目标,我建议在Github看杰克沃顿的u2020。简而言之,您为生产和调试风格提供了不同的API实现。或者,你可以有一个独立的风格进行集成测试。
不用匕首来解决这个问题的另一种方法(增加对它的支持对于正在进行的项目来说是一项相当大的工作),将会有集成测试的味道。例如。有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
主/ 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
}
}
}
我正是这样做的!这里是我写的关于它的一篇文章(它没有提到Espresso,但除了测试将包含Espresso api调用外,完全一样)请参阅[使用Dagger,Retrofit和MockWebServer进行Android测试](http://systemdotrun.blogspot .co.uk/2014/11/android-testing-with-dagger-retrofit.html) – Dori 2014-11-22 20:11:44
太棒了!很有帮助! – 2014-11-23 23:15:25