Android plain Junit with Dagger 2

I'm not sure if my solution will work for you but I see no reason it shouldn't. First I created testInjectionComponent

@Singleton
@Component(modules = {MockNetworkModule.class})
public interface MockInjectionComponent extends InjectionComponent {
void inject(DaggerUnitTest daggerUnitTest);
}

Then my Unit Tests I add injection in the before method. like so:

@Before
public void setUp() throws Exception {
    MockInjectionComponent mockInjectionComponent = DaggerMockInjectionComponent
            .builder()
            .mockNetworkModule(new MockNetworkModule())
            .build();
    mockInjectionComponent.inject(this);
}

Then I just Annotate my Injected Object.

EDIT : Do not forget to add testApt "com.google.dagger:dagger-compiler:$daggerVersion" at your app.gradle file .


You don't need any dagger to test your presenter. Dagger's job is it to fullfill the dependencies of your classes (dependency injection).

For example you have this Presenter:

public class MyPresenter {

    Database database;
    ApiService apiService;

    @Inject
    public MyPresenter(final Database database, final ApiService apiService) {
        this.database = database;
        this.apiService = apiService;
    }
}

Dagger will provide your Presenter with the database and apiService objects for your presenter to use them. When running the actual app (not a test) these will be real objects with real functionality.

When testing the presenter, you want to test only the presenter, everything else should be mocked.

So when you create the presenter in your PresenterTest, you create it with mocked versions of database and apiService.

You can then test how your presenter interacts with these object by

a. mocking the objects behaviour like

when(database.getSomething()).thenReturn(something)

b. verify your presenter does what you want it to do with these objects like

verify(database).saveSomething()

(pseudo code)

Standard way to mock would be Mockito.


As mentioned by the accepted answer. Do not forget to add :

For Java

Android Test

androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:$dagger_version'

JUnit test

testAnnotationProcessor 'com.google.dagger:dagger-compiler:$dagger_version'

For Kotlin

Android Test

kaptAndroidTest 'com.google.dagger:dagger-compiler:$dagger_version'

JUnit test

kaptTest 'com.google.dagger:dagger-compiler:$dagger_version'