У меня есть приложение для Android, которое использует Dagger 2 для инъекций зависимостей. Я также использую новейшие инструменты построения градиентов, которые позволяют вариант сборки для модульного тестирования и один для контрольных тестов. Я использую java.util.Random
в своем приложении, и я хочу издеваться над этим для тестирования. В классах, которые я тестирую, не используются никакие вещи Android, поэтому они просто обычные классы Java.Тесты для Android с кинжалом 2
В моем основном коде я определяю Component
в классе, который расширяет класс Application
, но в модульных тестах я не использую Application
. Я попытался определить тест Module
и Component
, но Кинжал не будет генерировать 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;
}
}
Test Module:
@Module
public class PipeGameTestModule {
@Provides
@Singleton
Random provideRandom() {
return mock(Random.class);
}
}
Это поможет https://stackoverflow.com/questions/26939340/how-do-you-override-a-module-dependency-in-a-unit-test-with-dagger-2-0 ? lq = 1 –
Возможно, вам стоит подумать о том, что Dagger не рекомендуется для модульного тестирования: https://google.github.io/dagger/testing.html –