предпочитам да не използвам отражение, което е бавно на android. Повечето от нас имат dagger2, настроен за инжектиране на зависимости. Имам тестов компонент, настроен за тестване. Ето кратък начин, по който можете да получите режим на приложение (тестващ или нормален):
създайте enum:
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);
}
}
не забравяйте да го декларирате в gradle така:
defaultConfig {
testInstrumentationRunner "com.mobile.pomelo.base.PomeloTestRunner"
}
Сега създайте подклас на метода AppModule с override, който изглежда точно така и не го маркирайте като модул над дефиницията на класа:
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;
така че когато изпълнявате тестове за еспресо, ще се тества enum, но когато е в производствен код, ще бъде нормално enum.
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