با استفاده از فایلهای ‘robolectric.properties’ برای پیکربندی سطح بسته(Package-Level Configuration) یا Config’ Annotation@'(حاشیهنویسی ‘Config@’) برای پیکربندی سطح کلاس(Class-Level) یا سطح متد(Method-Level)، میتوان چندین جنبه از رفتار Robolectric را در زمان اجرا پیکربندی نمود.
‘@Config’ Annotation
به منظور پیکربندی Robolectric برای یک Test Class یا Test Method منفرد، از حاشیهنویسی ‘Config@’ استفاده کنید. حاشیهنویسی میتواند به کلاسها و متدها اعمال شود. مقادیر مشخص شده در سطح متد، مقادیر مشخص شده در سطح کلاس را Override میکنند.
Base Classها نیز برای حاشیهنویسیها جستجو میشوند، بنابراین اگر شما همان مقادیری که خودتان تعیین کردهاید را روی تعداد زیادی از تستها پیدا کردید، میتوانید یک کلاس پایه ایجاد نموده و حاشیه نویسی ‘Config@’ خود را به آن کلاس منتقل کنید.
@Config(sdk=JELLYBEAN_MR1, manifest="some/build/path/AndroidManifest.xml", shadows={ShadowFoo.class, ShadowBar.class}) public class SandwichTest { }
‘robolectric.properties’ File
برای پیکربندی تمام تستهای Robolectric در یک بسته یا گروهی از بستهها، یک فایل با نام ‘robolectric.properties’ را در بسته مناسب ایجاد نمایید. به طور کلی، این فایل در داخل دایرکتوریِ Package مقتضی، ذیل “src/test/resources” در درخت پروژه قرار میگیرد. Robolectric با استفاده از مقادیر موجود در Packageهای عمیقتر و نادیده گرفتن مقادیر موجود در Packageهای کمعمقتر، برای Properties Fileها به سمت بالای سلسله مراتب Packageها(از جمله بسته پیشفرض بینام در سطح بالا) را جستجو میکند. وقتی کلاسها یا متدهای تست حاشیهنویسی ‘Config@’ دارند، هر نوع پیکربندی از Properties Fileها را لغو میکنند.
در زیر یک مثال ارائه شده است:
# src/test/resources/com/mycompany/app/robolectric.properties sdk=18 manifest=some/build/path/AndroidManifest.xml shadows=my.package.ShadowFoo,my.package.ShadowBar
نکتهای در مورد نسخه: قبل از Robolectric 3.1.3، فقط امکان مشخص کردن یک فایل ‘robolectric.properties’ سطح بالا وجود داشت.
پیکربندی Global
اگر میخواهید مقدار پیشفرض برای هر یک از مقادیر قابلپیکربندی را برای تمام تستهای خود تغییر دهید، میتوانید ‘RobolectricTestRunner’ را Extend کرده و متد ‘()buildGlobalConfig’ را لغو(Override) نمایید. سپس با استفاده از حاشیهنویسی ‘RunWith@’، میتوانید Test Runner ویژه خود را مشخص کنید.
قابل پیکربندیها
مثالهای زیر نشان میدهند که چگونه کارهای عمومی پیکربندی را اداره نمایید. برای وضوح و روشنی موضوع، از حاشیهنویسی ‘Config@’ استفاده شده است، اما هر یک از این مقادیر نیز میتوانند با استفاده از Properties Fileها پیکربندی شوند.
پیکربندی سطح SDK
به طور پیش فرض Robolectric کد شما را در برابر ‘targetSdkVersion’ که در مانیفست شما مشخص شده است، اجرا خواهد کرد. اگر میخواهید کد خود را تحت یک SDK متفاوت تست کنید، میتوانید SDK را با استفاده از Propertyهای پیکربندی ‘sdk’، ‘minSdk’ و ‘maxSdk’ مشخص کنید:
@Config(sdk = { JELLY_BEAN, JELLY_BEAN_MR1 }) public class SandwichTest { public void getSandwich_shouldReturnHamSandwich() { // will run on JELLY_BEAN and JELLY_BEAN_MR1 } @Config(sdk = KITKAT) public void onKitKat_getSandwich_shouldReturnChocolateWaferSandwich() { // will run on KITKAT } @Config(minSdk=LOLLIPOP) public void fromLollipopOn_getSandwich_shouldReturnTunaSandwich() { // will run on LOLLIPOP, M, etc. } }
توجه داشته باشید که ‘sdk’ و ‘minSdk’/’maxSdk’ ممکن است در یک حاشیهنویسی Config یا فایل مشخص نشده باشند؛ با این حال، ‘minSdk’ و ‘maxSdk’ ممکن است به همراه هم تعیین شوند. اگر هر یک از آنها اظهار شوند، بدین معنیست که آنها هر SDK Specification از یک مکان پیکربندی غیر ویژه را لغو میکنند.
نکتهای در مورد نسخه: قبل از Robolectric نسخه ۳٫۲، ‘minSdk’ و ‘maxSdk’ نادیده گرفته میشدند و ‘NEWEST’، ‘OLDEST’ و ‘TARGET’ نیز پشتیبانی نمیشد. همچنین فقط Integerهای مربوط به سطوح API در یک Properties File مشخص میشد.
پیکربندی Application Class
Robolectric تلاش میکند تا یک Instance از کلاس برنامه شما را به صورت مشخص شده در مانیفست ایجاد نماید. اگر میخواهید یک پیادهسازی سفارشی ارائه کنید، میتوانید آنرا با Setting مشخص کنید:
@Config(application = CustomApplication.class) public class SandwichTest { @Config(application = CustomApplicationOverride.class) public void getSandwich_shouldReturnHamSandwich() { } }
پیکربندی مسیرهای Asset و Resource
Robolectric پیشفرضها را برای Gradle و Maven فراهم میکند، اما به شما اجازه میدهد تا مسیر را به دایرکتوری مانیفست خود، Resource Directory و Assets Directory، سفارشیسازی(Customize) نمایید. اگر شما یک Build System دارید، چنین چیزی میتواند مفید باشد. شما میتوانید این مقادیر را بوسیله Setting مشخص کنید:
@Config(resourceDir = "some/build/path/res") public class SandwichTest { @Config(resourceDir = "other/build/path/ham-sandwich/res") public void getSandwich_shouldReturnHamSandwich() { } }
به صورت پیشفرض، Robolectric فرض را بر این میگیرد که Resourceها و Assetهای شما به ترتیب در دایرکتوریهایی به نام res و asset قرار دارند. این مسیرها نسبت به دایرکتوری که مانیفست در آن قرار دارد، در نظر گرفته میشوند. شما میتوانید این مقادیر را با اضافه کردن گزینههای ‘resourceDir’ و ‘assetDir’ به حاشیهنویسی ‘Config@’ تغییر دهید.
پیکربندی Qualifiers
شما میتوانید به طور صریح مجموعهای از Resource Qualifierها را برای یک آزمون پیکربندی کنید:
public class SandwichTest { @Config(qualifiers = "fr-xlarge") public void getSandwichName() { assertThat(sandwich.getName()).isEqualTo("Grande Croque Monégasque"); } }
برای جزئیات بیشتر به “استفاده از Qualified Resourceها” مراجعه کنید.
خصوصیات سیستم
برخی از گزینههای تکمیلی را میتوان با تنظیم این Propertyهای سیستمی به صورت Global پیکربندی کرد:
- robolectric.enabledSdks – لیستی جدا شده با کاما از نامها یا سطوح SDK(به عنوان مثال ۲۱ ,۱۹ یا KITKAT, LOLLIPOP) که برای این فرآیند فعال شدهاند. فقط تستهایی که در SDKهای لیست شده مد نظر هستند اجرا خواهند شد. به طور پیش فرض تمام SDKها فعال هستند.
- robolectric.offline – واکشی Jarها در زمان اجرا(Run-Time) را برای غیرفعالسازی به True سِت میکند.
- robolectric.dependency.dir – هنگامی که در حالت آفلاین هستیم، یک پوشه حاوی Run-Time Dependencyها را مشخص میکند.
- robolectric.dependency.repo.id – به منظور بهرهبرداری برای Run-Time Dependencyها، ID مربوط به Maven Repository را سِت میکند(پیشفرض ‘sonatype’).
- robolectric.dependency.repo.url – سِت کردن URL مربوط به Maven Repository به منظور بهرهبرداری برای Run-Time Dependencyها(پیشفرض ‘https://oss.sonatype.org/content/groups/public/’).
- robolectric.logging.enabled – برای فعالسازی Debug Logging این مشخصه را به True سِت کنید.
هنگام استفاده از Gradle، میتوانید System Propertyها را برای Unit Testها با بلوک ‘all’ پیکربندی کنید(اینجا را ببینید). برای مثال، Override(لغو) کردن URL مربوط به Maven Repository و ID برای دانلود Run-Time Dependencyها از یک Repository غیر از Sonatype:
android { testOptions { unitTests.all { systemProperty 'robolectric.dependency.repo.url', 'https://local-mirror/repo' systemProperty 'robolectric.dependency.repo.id', 'local' } } }
تمام قسمتهای آموزش Robolectric، به صورت دستهبندی شده از اینجا نیز در دسترس است.