2015-11-22 1 views
1

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()?

+1

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

+0

@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'. –

Répondre

1

Divisez les tests en 2 classes, l'une avec tous les tests utilisant l'API simulée, l'autre avec l'API réelle.

Utilisez ce que vous avez en tant que classe de base, déplacez la valeur de mockMode dans une méthode, puis remplacer cette méthode dans l'autre classe:

public class MainActivityMockApiTest extends ActivityInstrumentationTestCase2<BaseActivity> { 

    ... 

    @Override 
    protected void setUp() throws Exception { 
     ... 
     app.setMockMode(isMockMode()); 
     ... 
    } 

    protected boolean isMockMode() { 
     // overridden in MainActivityRealApiTest 
     return true; 
    } 

    ... 
}