私は最近、簡単な依存性注入のためにAndroidアプリケーションにDagger2を実装しましたが、その後、いくつかのテストが機能しなくなりました。AndroidでDagger2 Dependency Injection&Robolectricを使ってテストするには?
Dagger2で動作するようにテストを調整する方法を理解しようとしていますか?私はテストを実行するためにRobolectricを使用しています。
ここではDagger2をどのように使用しているのですか?私はこれを最近学んだだけですので、これは悪い習慣であり、テストを助けるものではありません。
私は次のようであるAppModuleあります
@Module
public class MyAppModule {
//Application reference
Application mApplication;
//Set the application value
public MyAppModule(Application application) {
mApplication = application;
}
//Provide a singleton for injection
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
そして、私は次のようである注射用オブジェクトを提供しNetworkModule呼び出す:
@Module
public class NetworkModule {
private Context mContext;
//Constructor that takes in the required context and shared preferences objects
public NetworkModule(Context context){
mContext = context;
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(){
//...
}
@Provides @Singleton
OkHttpClient provideOKHttpClient(){
//...
}
@Provides @Singleton
Picasso providePicasso(){
//...
}
@Provides @Singleton
Gson provideGson(){
//...
}
}
をそしてコンポーネントが似ていますこれは:
Singleton
@Component(modules={MyAppModule.class, NetworkModule.class})
public interface NetworkComponent {
//Activities that the providers can be injected into
void inject(MainActivity activity);
//...
}
私のテストでは、Robolectricを使用しています。私のApplicationクラスには、次のように:あなたは私が私のDagger2モジュールの嘲笑のバージョンが使用されていることを確認しようとしています見ることができるように
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;
}
}
が、これらはTestMyApplicationと返す嘲笑NetworkModuleを返す嘲笑MyAppModuleと同様に嘲笑されています私は実際のNetworkComponentを拡張する虚偽のNetworkComponentも持っています。私はこのようなRobolectricを使用してアクティビティを作成、テストのセットアップで
:
//Build activity using Robolectric
ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class);
activity = controller.get();
controller.create(); //Create out Activity
このアクティビティを作成してのonCreateを開始し、問題が発生したところ、これがある、のonCreateで私は、次のしていますそれはこのよう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が取得するということですので、私は私の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);
}
}
あなたのTestNetworkModuleに何を追加できますか? – jbarat
確かに、ちょうど今そこにいた –
あなたのピカソ模造が呼ばれるときに何が起こるべきであるかを定義しますか?何かこのように:when(picassoMock.load(anyString()))thenReturn(something) – jbarat