我正在使用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);
}
}
从代码中可以看出,我希望用mock api进行一些测试,也希望用real api进行其他测试。为了做到这一点,我需要知道调用哪个测试setUp()
,这样我就可以相应地更改setMockMode(boolean)
的参数。
有没有办法让我知道哪个测试是setUp()
?
将测试分成两个类,一个类包含所有使用模拟API的测试,另一个类则包含真正的API。
使用您的基类,将mockMode
的值移动到一个方法中,然后在另一个类中重写该方法:
public class MainActivityMockApiTest extends ActivityInstrumentationTestCase2<BaseActivity> {
...
@Override
protected void setUp() throws Exception {
...
app.setMockMode(isMockMode());
...
}
protected boolean isMockMode() {
// overridden in MainActivityRealApiTest
return true;
}
...
}