2015-10-18 1 views
3

J'ai une activité avec une dépendance:Mocking Constructors dans Injecté Dagger 2

public class MyActivity extends AppCompatActivity { 

    @Inject Dependency; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // inject 
    } 

} 

public class Dependency { 

    @Inject 
    public Dependency() { 
     //.. 
    } 

} 

Depuis Dependency a injecté un constructeur, Dagger2 ne nécessite pas un module de savoir comment instancier, ce qui est super pratique.

Ma question est: À des fins de test, dois-je avoir un module explicite qui fournit Dependency afin de pouvoir se moquer de lui et fournir une version fictive de Dependency? ou est-il un moyen de se moquer Dependency sans elle?

Répondre

3

J'ai trouvé un moyen sans créer un module explicite. Voici comment je l'ai fait en utilisant Robolectric et Mockito:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
public class MyActivityTest { 

    @Mock AppComponent mAppComponent; 
    @Mock private Dependency mDependency; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 

     // *** 
     // use the mock AppComponent to perform injections 
     // *** 

     doAnswer(new Answer() { 
      public Object answer(InvocationOnMock invocation) { 
       ((MyActivity) invocation.getArguments()[0]).mDependecy = mDependecy; 
       return null; 
      } 
     }).when(mAppComponent).inject(any(MyActivity.class)); 
    } 
}