我有一个使用Dagger 2进行依赖注入的Android应用程序。我还使用了最新的gradle构建工具,允许为单元测试和仪表盘测试创建不同的构建变体。我在我的应用程序中使用了java.util.Random,并希望在测试中对其进行模拟。我正在测试的类不使用任何Android内容,因此它们只是普通的Java类。
在我的主要代码中,我在扩展Application类的类中定义了一个Component,但在单元测试中我没有使用Application。我尝试定义了一个测试Module和Component,但是Dagger不会生成Component。我也尝试使用我在应用程序中定义的Component并在构建时交换Module,但是应用程序的Component没有为我的测试类提供inject方法。如何为测试提供Random的模拟实现?
下面是一些示例代码:
应用程序:
在我的主要代码中,我在扩展Application类的类中定义了一个Component,但在单元测试中我没有使用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);
}
}