I recently implemented Dagger2 in an Android application for a simple dependency injection, but after that some of my tests stopped working.
Now I'm trying to figure out how to set up my tests to work with Dagger2? I use Robolectric to run my tests.
This is how I use Dagger2, I only recently found out about it, so it may be bad practice and not help in the tests, so please indicate any improvements that I can make.
I have an AppModule that looks like this:
@Module
public class MyAppModule {
Application mApplication;
public MyAppModule(Application application) {
mApplication = application;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
And what I call NetworkModule, which provides objects for injection, looks like this:
@Module
public class NetworkModule {
private Context mContext;
public NetworkModule(Context context){
mContext = context;
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(){
}
@Provides @Singleton
OkHttpClient provideOKHttpClient(){
}
@Provides @Singleton
Picasso providePicasso(){
}
@Provides @Singleton
Gson provideGson(){
}
}
And then the Component looks like this:
Singleton
@Component(modules={MyAppModule.class, NetworkModule.class})
public interface NetworkComponent {
void inject(MainActivity activity);
}
Robolectric, :
public class TestMyApplication extends TestApplication {
private static TestMyApplication sInstance;
private NetworkComponent mNetworkComponent;
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
mNetworkComponent = DaggerTestMyApplication_TestNetworkComponent.builder()
.testMyAppModule(new TestMyAppModule(this))
.testNetworkModule(new TestNetworkModule(this)).build();
}
public static MyApplication getInstance() {
return sInstance;
}
@Override public NetworkComponent getNetComponent() {
return mNetworkComponent;
}
}
, , Dagger2, , Moyed MyAppModule TestMyApplication, NetworkModule , NetworkComponent, NetworkComponent.
Robolectric :
ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class);
activity = controller.get();
controller.create();
Activity onCreate, . onCreate Activity , Dagger2 :
@Inject Picasso picasso; //Injected at top of Activity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
MyApplication.getInstance().getNetComponent().inject(this);
picasso.load(url).fetch();
, NullPointerException picasso, , , Dagger2 - ?
EDIT: TestNetworkModule
@Module
public class TestNetworkModule {
public TestNetworkModule(Context context){
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(){
return Mockito.mock(SharedPreferences.class);
}
@Provides @Singleton
Gson provideGson(){
return Mockito.mock(Gson.class);
}
@Provides @Singleton
OkHttpClient provideOKHttpClient(){
return Mockito.mock(OkHttpClient.class);
}
@Provides @Singleton
Picasso providePicasso(){
return Mockito.mock(Picasso.class);
}
}