تست نویسی و استفاده از دیزاین پترن Builder

سلام به همگیاستفاده ی عملی از دیزاین پترن Builderداشتم برای نرم افزاری که در حال توسعه با زبان Java هستم Integration Test می نوشتم و برای تست ثبت سفارش به یک کاربر با حالت های مختلف از وضعیت اون کاربر نیاز داشتمسه تا از وضعیت های مختلف یک کاربر از قرار زیر هستند:آیا کاربر ثبت نام شده است یا خیر؟ایا اکانت کاربر تایید شده است یا خیر؟آیا کاربر قرارداد استفاده از نرم افزار را تایید کرده است یا خیر؟البته حالت های دیگه ای هم هست اما خب من به همین 3 مورد برای شلوغ نشدن متنم کفایت میکنمخب با همین 3 مورد به تستمون برسیمچندتا از تست هایی که می نویسیم از قرار زیر هستن:اگر کاربر لاگین نشده بود (یعنی توکن احراز هویت ارسال نکرده بود) خطای 401 برگردونهاگر اکانت کاربر تایید نشده بود خطای 403 برگردونهاگر کاربر قرارداد استفاده از نرم افزار رو تایید نکرده خطای 403 برگردونهاگر اکانت کاربر تایید شده بود ولی کاربر قرارداد استفاده از نرم افزار رو تایید نکرده بود خطای 403 برگردونهاگر اکانت کاربر تایید نشده بود ولی کاربر قرارداد رو تایید کرده بود خطای 403 برگردونهو تست های بعدی که مربوط به سفارش و اکانت هستهمینطور که می بینید ما 5 تا تست برای کاربر با حالت های مختلف نیاز داریماول اومدم و خواستم با چند تا متد انجامش بدم ولی دیدم که چقدر ساختن کاربر با وضعیت های مختلف با دیزاین پترن Builder راحت ترهیک کلاس به اسم UserApi دارم که کار های مربوط به کاربر رو انجام میدم. حالا کافیه کلاس Builderام را داخل همین کلاس بنویسم به این صورت:public static class Builder { private String mobile = &quot09122221122" private boolean authenticated = false; private boolean acceptContract = false; public Builder setMobile(String mobile) { this.mobile = mobile; return this; } public Builder authenticated() { this.authenticated = true; return this; } public Builder acceptContract() { this.acceptContract = true; return this; } public String buildToken() { User user = // create user by mobile … if (authenticated) // set user authentication status to true if (acceptContract) // set user contract status to truereturn // token generated by user details } }نکته: چون من در نهایت Token کاربر را نیاز دارم Token رو در کلاس Builder می سازمکلاس Buidler بالا اسکلت بندی مربوط به Builder هست و شما میتونید بر مبنای نیازتون مقادیرش رو کامل کنید.برای استفاده ازش یک static methodاز کلاس UserApi ساختم:public static Builder get() { return new Builder(); }البته شما می توانید نیاز ساخت کاربر و Token را به عنوان آرگومانت های ورودی برای کلاس Builder ارسال کنید.اما مهمترین بخش یعنی استفاده کردن از کلاس Builder که ساختیمحالا کافیه برای هر تست من کاربر رو بسازم:الان من یک کاربر با شماره ی پیشفرض دارم که میتونم ازش استفاده کنم:UserApi.get().buildToken(); یک کاربر با شماره جدید:UserApi.get().setMobile("09123332211").buildToken();یک کاربر که ثبت نام کرده و تنها اکانت کاربری اش تایید شده است:UserApi.get().authenticated().buildToken();یک کاربر که تنها قرارداد استفاده از نرم افزار را تایید کرده است:UserApi.get().acceptContract().buildToken();یک کاربر که علاوه بر اینکه اکانتش تایید شده است، قرارداد استفاده از نرم افزار را نیز تایید کرده است:UserApi.get().authenticated().acceptContract().buildToken();همونطور که میبینید به یک یا چند کاربر با وضعیت های مختلف دسترسی داریم و به راحتی می توانیم تستمون رو انجام بدیم.پ.ن: من توی این نوشته دیزاین پترن رو آموزش ندادم. تنها نحوه و مزیت استفاده از اون رو توی این مثال خاص توضیح دادم