依存性注入に Dagger 2 を使用する Android アプリがあります。また、単体テスト用のビルド バリアントとインストルメンテーション テスト用のビルド バリアントを許可する最新の gradle ビルド ツールも使用しています。私はjava.util.Random
自分のアプリで使用していますが、これをテスト用にモックしたいと考えています。私がテストしているクラスは Android のものを使用していないため、通常の Java クラスです。
私のメイン コードComponent
では、クラスを拡張するクラスでを定義していますApplication
が、単体テストでは . を使用していませんApplication
。Module
テストと を定義しようとしましComponent
たが、Dagger は . を生成しませんComponent
。また、アプリケーションで定義した を使用して、ビルド時に をComponent
交換しようとしましたが、アプリケーションにはテスト クラスのメソッドがありません。テスト用のモック実装を提供するにはどうすればよいですか?Module
Component
inject
Random
サンプルコードは次のとおりです。
応用:
public class PipeGameApplication extends Application {
private PipeGame pipeGame;
@Singleton
@Component(modules = PipeGameModule.class)
public interface PipeGame {
void inject(BoardFragment boardFragment);
void inject(ConveyorFragment conveyorFragment);
}
@Override
public void onCreate() {
super.onCreate();
pipeGame = DaggerPipeGameApplication_PipeGame.create();
}
public PipeGame component() {
return pipeGame;
}
}
モジュール:
@Module
public class PipeGameModule {
@Provides
@Singleton
Random provideRandom() {
return new Random();
}
}
テストの基本クラス:
public class BaseModelTest {
PipeGameTest pipeGameTest;
@Singleton
@Component(modules = PipeGameTestModule.class)
public interface PipeGameTest {
void inject(BoardModelTest boardModelTest);
void inject(ConveyorModelTest conveyorModelTest);
}
@Before
public void setUp() {
pipeGameTest = DaggerBaseModelTest_PipeGameTest.create(); // Doesn't work
}
public PipeGameTest component() {
return pipeGameTest;
}
}
また:
public class BaseModelTest {
PipeGameApplication.PipeGame pipeGameTest;
// This works if I make the test module extend
// the prod module, but it can't inject my test classes
@Before
public void setUp() {
pipeGameTest = DaggerPipeGameApplication_PipeGame.builder().pipeGameModule(new PipeGameModuleTest()).build();
}
public PipeGameApplication.PipeGame component() {
return pipeGameTest;
}
}
テスト モジュール:
@Module
public class PipeGameTestModule {
@Provides
@Singleton
Random provideRandom() {
return mock(Random.class);
}
}