قبل از Robolectric 2.2، اکثر تستها، Activityها را مستقیما با فراخوانی Constructorها، (()new MyActivity) و سپس فراخوانی دستی متدهای Lifecycle از قبیل ‘()onCreate'” ایجاد میکردند. همچنین به طور گستردهای از مجموعهای از متدها در ‘ShadowActivity’ (به عنوان مثال ‘()ShadowActivity.callOnCreate’) استفاده میشد، که برای ‘ActivityController’ به نوعی Precursor بودند.
‘ActivityController’ یک Robolectric API است که تمام این موضوعات را تغییر میدهد. هدف آن تقلید این موضوع است که Android چگونه Activityهای شما را ایجاد نموده و آنها را از طریق Lifecycleشان Drive میکند.
‘ActivityController’ یک API است که در Robolectric 2.0 معرفی شد و در حال حاضر در نسخه ۲٫۲ یک API ضروریست. این API علاوه بر فراخوانی متدهایی مانند ‘()onCreate’، تضمین میکند که وضعیت داخلی ACtivity با Lifecycle سازگار باشد. این موضوع شامل Attach کردن Activity به Window و دردسترس قرار دادن سرویسهای سیستمی مانند ‘LayoutInflater’ است.
حالا چی کار کنم؟
شما عموما ‘ActivityController’ را مستقیما ایجاد نمیکنید. برای شروع کار از ‘()Robolectric.buildActivity’ استفاده کنید. برای اساسیترین تستها که نیاز به یک Initialized Activity دارید، اغلب میتوانید از خط زیر استفاده کنید:
Activity activity = Robolectric.buildActivity(MyAwesomeActivity.class).create().get();
این یک Instance جدید از ‘MyAwesomeActivity’ ایجاد نموده و آنرا از طریق Lifecycle برای ‘()onCreate’ فراخوانی میکند.
آیا میخواهید بررسی کنید که چه چیزهایی در ‘()onResume’ رخ میدهد، اما در ‘()onCreate’ اتفاق نمیافتد؟ به سادگی میتوان این کار را انجام داد!
ActivityController controller = Robolectric.buildActivity(MyAwesomeActivity.class).create().start(); Activity activity = controller.get(); // assert that something hasn't happened activityController.resume(); // assert it happened!
متدهای مشابه برای ‘()start()’، ‘pause()’، ‘stop’ و ‘()destroy’ گنجانده شدهاند. بنابراین، اگر میخواهید Lifecycle ساخت کامل(Full Creation) را تست کنید:
Activity activity = Robolectric.buildActivity(MyAwesomeActivity.class).create().start().resume().visible().get();
شما میتوانید شروع Activity را با یک هدف(intent) شبیهسازی کنید:
Intent intent = new Intent(Intent.ACTION_VIEW); Activity activity = Robolectric.buildActivity(MyAwesomeActivity.class, intent).create().get();
… و یا Instance State ذخیره شده را بازگردانید:
Bundle savedInstanceState = new Bundle(); Activity activity = Robolectric.buildActivity(MyAwesomeActivity.class) .create() .restoreInstanceState(savedInstanceState) .get();
به منظور رویت متدهای عمومیتر موجود برای احتیاجات تست خود، لطفا ActivityController’ Java Docs‘ را Check out کنید.
صبر کنید، ()visible چه مزخرفیست؟
در یک برنامه واقعی Android، سلسله مراتب View یک ‘Activity’ تا زمانی که بعد از ‘()onCreate’ فراخوانی شود به ‘window’ ضمیمه(Attach) نمیشود. مادامیکه چنین اتفاقی نیفتد، Viewهای ‘Activity’ به عنوان Visible گزارش نمیشوند. این بدان معنیست که شما نمیتوانید بر روی آنها کلیک کنید(از جمله رفتارهای غیر منتظره). سلسله مراتب ‘Activity’ پس از ‘()onPostResume’ در ‘Activity’، بر روی یک دستگاه یا Emulator به ‘Window’ ضمیمه(Attach) میشود. Robolectric به دستان توسعهدهندگان در زمان نوشتن تست قدرت میدهد.
بنابراین چه زمانی ()Visible را فراخوانی میکنید؟ پاسخ این است: “هر زمان که با Viewهای درون ‘Activity’ تعامل میکنید”. متدهایی مانند ‘()Robolectric.clickOn’ نیاز دارند که View در حالت Visible بوده و به درستی به Function ضمیمه شود. شما باید ‘()visible’ را بعد از ‘()create’ فراخوانی نمایید.
تمام قسمتهای آموزش Robolectric، به صورت دستهبندی شده از اینجا نیز در دسترس است.