【发布时间】:2015-11-22 12:06:35
【问题描述】:
我正在使用 Mockito 为我的 Android 应用程序编写单元测试。 我正在使用 dagger 2 在模拟客户端和真实客户端之间切换:
@Module
public class ApiModule {
private boolean mMockMode;
@Provides
@Singleton
Client provideClient() {
if (mMockMode) {
return Mockito.mock(Client.class);
}
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.networkInterceptors().add(new StethoInterceptor());
return new OkClient(okHttpClient);
}
}
客户端像这样被注入到测试中:
public class MainActivityTest extends ActivityInstrumentationTestCase2<BaseActivity> {
@Inject
Client client;
public MainActivityTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
App app = (App) getInstrumentation().getTargetContext().getApplicationContext();
app.setMockMode(true);
app.component().inject(this);
}
@Test
public void testWithActualCall(){
//code...
}
@Test
public void testWithMockCall(){
//code...
}
@Override
protected void tearDown() throws Exception {
App.getInstance().setMockMode(false);
}
}
从代码中可以看出,我希望使用模拟 api 进行一些测试,而我希望使用真正的 api 进行其他测试。为此,我需要知道正在调用哪个测试 setUp(),以便我可以相应地更改 setMockMode(boolean) 的参数。
有什么方法可以查出setUp()是哪个测试?
【问题讨论】:
-
他们在 ApiModule 类中混合测试和生产代码的方式是一种代码味道,imo。查看 dagger 文档中的“模块覆盖”以获得更好的使用模拟注入的解决方案:square.github.io/dagger
-
@Bewusstsein 您链接到的模块覆盖是原始 Dagger 的一部分,而不是 Google 的 Dagger 2 分支。也就是说,你对气味的看法是对的,你可以轻松地制作一个扩展 ApiModule 并覆盖
provideClient方法的模块。
标签: android unit-testing mockito dagger-2