В настоящее время я разрабатываю приложение Android MVP и пытаюсь разделить свои зависимости в разных модулях Dagger2.
Проблема, с которой я сталкиваюсь, связана с изменением модуля во время модульного тестирования. Сценарий следующий:
- LoginComponent, который использует два модуля: LoginModule и HTTPModule.
- LoginModule в одном из своих методов требует экземпляра OkHttp, который предоставляется HTTPModule.
Код следующий:
@Singleton
@Component(modules = {LoginModule.class, HTTPModule.class})
public interface LoginComponent {
}
@Module(includes = {HTTPModule.class})
public class LoginModule {
@Provides
@Singleton
public MyThing provideMyThing(OkHttpClient client) {
// Do things with it
}
}
@Module
public class HTTPModule {
@Provides
@Singleton
public OkHttpClient provideOkHttpClient(){
// Return the OkHttpClient
}
}
Дело в том, что во время тестирования мне нужно будет изменить возвращаемый OkHttpClient (заставив его принимать все сертификаты, так как когда я запускаю его на JVM, он не принимает сертификат LetsEncrypt).
Также мне это понадобится, потому что мне нужно объявить, что MyTest.class
можно внедрить с модулем, а поскольку MyTest.class
находится в папке app/src/test/
, он не виден для классов, помещенных в app/src/main/
. Что я сделал до сих пор, так это скопировал и вставил компонент и модули в папку /test/
и сделал там объявление внедренного класса. Но я знаю, что должен быть правильный способ достичь того, что я ищу.
Еще одна вещь, которую я пробовал, - это аннотировать методы с помощью пользовательских областей видимости (создавая аннотацию @TestScope
). Однако это приводит меня к той же проблеме, о которой я говорил ранее: я не могу сделать MyTest.class
видимым для компонента, потому что он находится в папке /test/
.
Я уже проверил другие подобные вопросы, такие как этот и это еще один, но последний предназначен для запуска тестов с Robolectric, и к настоящему времени я могу выполнять модульное тестирование большей части своего кода только с JUnit4 (Android Studio 2-Beta 8).
Если бы кто-нибудь мог указать мне правильное направление, я был бы более чем благодарен.
Заранее спасибо!
HTTPModule
при создании компонента в методеDagger__Component.builder()
? - person EpicPandaForce   schedule 11.02.2016@Provides
в переопределенном методе, где вы его переопределили. Вродеnew HTTPModule() { @Override public provideOkHttpClient() { return new MockHttpClient(); };
должно работать. - person EpicPandaForce   schedule 12.02.2016