я предпочитаю не использовать отражение, которое медленно работает на Android. У большинства из нас есть dagger2, настроенный для внедрения зависимостей. У меня есть тестовый компонент, настроенный для тестирования. Вот краткий способ получить режим приложения (тестовый или обычный):
создать перечисление:
public enum ApplicationMode {
NORMAL,TESTING;
}
и обычный AppModule:
@Module
public class AppModule {
@Provides
public ApplicationMode provideApplicationMode(){
return ApplicationMode.NORMAL;
}
}
создайте тестовый бегун, как я:
public class PomeloTestRunner extends AndroidJUnitRunner {
@Override
public Application newApplication(ClassLoader cl, String className, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return super.newApplication(cl, MyTestApplication.class.getName(), context);
}
}
не забудьте объявить это в градле следующим образом:
defaultConfig {
testInstrumentationRunner "com.mobile.pomelo.base.PomeloTestRunner"
}
Теперь создайте подкласс AppModule с методом переопределения, который выглядит точно так же, и не помечайте его как модуль над определением класса:
public class TestAppModule extends AppModule{
public TestAppModule(Application application) {
super(application);
}
@Override
public ApplicationMode provideApplicationMode(){
return ApplicationMode.TESTING; //notice we are testing here
}
}
теперь в вашем классе MyTestApplication, который вы объявили в пользовательском тестировщике, объявлено следующее:
public class PomeloTestApplication extends PomeloApplication {
@Singleton
@Component(modules = {AppModule.class})
public interface TestAppComponent extends AppComponent {
}
@Override
protected AppComponent initDagger(Application application) {
return DaggerPomeloTestApplication_TestAppComponent.builder()
.appModule(new TestAppModule(application)) //notice we pass in our Test appModule here that we subclassed which has a ApplicationMode set to testing
.build();
}
}
Теперь, чтобы использовать его, просто вставьте его в производственный код, например:
@Inject
ApplicationMode appMode;
поэтому, когда вы запускаете тесты эспрессо, он будет тестировать перечисление, но в производственном коде это будет обычное перечисление.
ps не обязательно, но если вам нужно посмотреть, как мой производственный кинжал строит график, он выглядит так и объявлен в подклассе приложения:
protected AppComponent initDagger(Application application) {
return DaggerAppComponent.builder()
.appModule(new AppModule(application))
.build();
}
person
j2emanue
schedule
14.11.2017
Class.forName()
проверка наличия кода тестирования в виртуальной машине: wtanaka.com/node/8041 - person CommonsWare   schedule 17.02.2015