J'écris des tests unitaires pour mon application Android en utilisant Mockito. J'utilise dague 2 pour basculer entre un client Mock et un vrai client:Déterminez pour quel test setup() est appelé?
@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);
}
}
Le client est injecté dans les essais comme celui-ci:
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);
}
}
Comme on le voit à partir du code, il y a quelques tests que je veux faire avec une fai api et d'autres que je souhaite faire avec le vrai api. Pour ce faire, j'ai besoin de savoir pour quel test setUp()
est appelé afin que je puisse changer l'argument de setMockMode(boolean)
en conséquence.
Y at-il un moyen de savoir quel test est setUp()
?
Ils comme vous mélangeons de test et le code de production dans le ApiModule classe est une odeur de code, imo. Jetez un oeil à "module overrides" dans les docs dagger pour une meilleure solution pour utiliser les injections simulées: https://square.github.io/dagger/ – Bewusstsein
@Bewusstsein Le module overrides vous lié à font partie du poignard original, pas la fourchette Dagger 2 de Google. Cela dit, vous avez raison sur l'odeur, et vous pouvez facilement créer un module qui étend ApiModule et remplace la méthode 'provideClient'. –