У меня есть приложение для Android, которое использует Dagger 2 для инъекции зависимостей. Я также использую новейшие инструменты сборки gradle, которые позволяют вариант сборки для модульного тестирования и один для контрольных тестов. Я использую java.util.Random в своем приложении, и я хочу издеваться над этим для тестирования. В классах, которые я тестирую, не используются какие-либо элементы Android, поэтому они просто обычные классы Java.
В моем основном коде я определяю 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;
    }
}
Модуль тестирования:
@Module
public class PipeGameTestModule {
    @Provides
    @Singleton
    Random provideRandom() {
        return mock(Random.class);
    }
}