Robolectric شبیهسازی انواع مختلف پیکربندی Device را ساده میکند. به طور خاص، Propertyهایی که کلاس ‘android.content.res.Configuration’ را تشکیل میدهند میتوانند همانطور که در اینجا توضیح داده شده است در متد تست، کلاس تست، بسته یا سطح Siute، مشخص شوند.
تنظیم پیکربندی دستگاه
پیکربندی دستگاه Android را میتوان با استفاده از Property ویژه Config به نام ‘qualifiers’ مشخص کرد:
@Test @Config(qualifiers = "fr-rFR-w360dp-h640dp-xhdpi") public void testItOnFrenchNexus5() { ... }
از نسخه ۳٫۶، Robolectric با توجه به قوانین مندرج در اینجا(اما بدون نام دایرکتوری قبلی)، Property(ویژگی) “Qualifiers” را Pars کرده و محیط شبیهسازی Android را با یک پیکربندی متناظر ستاپ میکند. Objectهای ‘Configuration’، ‘Display’ و ‘DisplayMetrics’ مربوط به سیستم: پیکربندی مشخص شده، Localeای که سِت خواهد شد، و منابع مناسبی که انتخاب خواهند شد را بازتاب خواهند کرد.
در رابطه با Propertyهای نامشخص، Robolectric بر اساس Propertyهای مشخص شده مقادیر سازگار را انتخاب نموده و یا مقادیر پیشفرض را طبق جدول ذیل استفاده خواهد کرد:
Property | مقدار محاسبه شده(در صورت نامشخص بودن) | پیشفرض | دیگر قوانین |
---|---|---|---|
MCC and MNC | None | None | |
Language, region, and script-locale | None | en-rUS | |
Layout direction | layout direction محلی | ldltr | |
Smallest width | کوچکتر از عرض و ارتفاع | sw320dp | |
Width | اگر اندازه صفحه نمایش مشخص شده باشد، عرض مربوطه همان چیزیست که اینجا اعلام شده است | w320dp | اگر جهتگیری صفحه نمایش مشخص شده باشد، عرض و ارتفاع به صورت مقتضی تبادل میشوند |
Height | اگر اندازه صفحه نمایش مشخص شده باشد، ارتفاع مربوطه همان چیزیست که در اینجا اعلام شده است. اگر طول صفحه نمایش مشخص شده باشد، ارتفاع آن 25% افزایش مییابد | h470dp | اگر جهتگیری صفحه نمایش مشخص شده باشد، عرض و ارتفاع به صورت مقتضی تبادل میشود |
Screen size | اگر ارتفاع و عرض مشخص شده باشند، اندازه صفحه نمایش مربوطه همان چیزیست که در اینجا اعلام شده است. | normal | |
Screen aspect | اگر عرض و ارتفاع مشخص شده باشد، در صورتیکه نسبت ارتفاع به عرض حداقل 1.75 باشد، استفاده میشود. | notlong | |
Round screen | اگر UI Mode برابر با watch است، به eound میرود | notround | |
Wide color gamut | None | nowidecg | |
High dynamic range | None | lowdr | |
Screen orientation | اگر عرض و ارتفاع مشخص شده باشد، در صورت تناسب port یا land میشود | port | |
UI mode | None | normal، به جز این property چیزی در Qualifier List وجود ندارد |
|
Night mode | None | notnight | |
Screen pixel density | None | mdpi | |
Touchscreen type | None | finger | |
Keyboard availability | None | keyssoft | |
Primary text input method | None | nokeys | |
Navigation key availability | None | navhidden | |
Primary non-touch navigation method | None | nonav | |
Platform version | سطح SDK در حال حاضر فعال است. لازم نیست مشخص شود |
Qualifierهای تجمعی
به طور پیشفرض، مشخص کردن Qualifierها باعث میشود که هیچ یک از مشخصات Qualifierهای قبلی نادیده گرفته نشود. به عنوان مثال، Qualifierها در سطح متد تست به Qualifierهای در سطح کلاس تست بستگی دارند. با این حال، اگر ویژگی config، مربوط به Qualifierها با یک علامت ‘+’ (علامت پلاس) شروع شود، به عنوان یک پوشش برای هر یک از Qualifierهایی که مشخص شدهاند، تفسیر میشود:
@Config(qualifiers = "xlarge-port") class MyTest { public void testItWithXlargePort() { ... } // config is "xlarge-port" @Config(qualifiers = "+land") public void testItWithXlargeLand() { ... } // config is "xlarge-land" @Config(qualifiers = "land") public void testItWithLand() { ... } // config is "normal-land" }
مقادیر Propertyهای نامشخص محاسبه میشوند، و بعد از اینکه تمام Configها ادغام شدند، قوانین اِعمال میگردند.
تغییر پیکربندی دستگاه
پیکربندی دستگاه را میتوان در یک تست با استفاده از ‘()RuntimeEnvironment.setQualifiers’ تغییر داد:
@Test @Config(qualifiers = "+port") public void testOrientationChange() { controller = Robolectric.buildActivity(MyActivity.class); controller.setup(); // assert that activity is in portrait mode RuntimeEnvironment.setQualifiers("+land"); controller.configurationChange(); // assert that activity is in landscape mode }
پارامتر string برای ‘()setQualifiers’ دارای قوانین مشابه ‘Config.qualifiers’ است.
توجه داشته باشید که ‘()RuntimeEnvironment.setQualifiers’، منابع سیستم و اپلیکیشن را با پیکربندی جدید به روز میکند، اما هیچگونه فعالیتی بر روی فعالیتهای موجود یا سایر کامپوننتها ایجاد نمیکند. ‘()ActivityController.configurationChange’ را میتوان برای شبیهسازی دنبالهای از رویدادهایی که در یک دستگاه هنگام تغییر پیکربندی آن اتفاق میافتند استفاده نمود.
اگر فعالیت برای ادارۀ تغییرات پیکربندی، تنظیم شده باشد، ‘()ActivityController.configurationChange’ متد ‘()onConfigurationChanged’ متعلق به این Activity را فراخوانی میکند. در غیر اینصورت، ActivityController فعالیت مذبور را از بین برده و آنرا مجددا ایجاد مینماید.
شبیهسازی Displayها
Robolectric اجازه میدهد تا Propertyهای Display در خلال یک تست با استفاده از Setterهای روی ‘()ShadowDisplay’ تغییر کنند. برای سیستم عامل Jelly Bean MR1 و بالاتر، Displayهای چندگانه را میتوان با استفاده از APIها در ‘ShadowDisplayManager’ شبیهسازی نمود. لطفا به منظور جزئیات بیشتر، اسناد خود را مشاهده کنید.
تمام قسمتهای آموزش Robolectric، به صورت دستهبندی شده از اینجا نیز در دسترس است.