Mock با استفاده از برنامههای کمکی که به اسم Isolation Framework یا Mocking Framework معروف هستند انجام میشود. Rhino Mocks معروفترین و پراستفادهترین Mock Framework در داتنت است. در روش Mock ما آن آبجکتی را که قرار است شبیهسازی شود را معرفی میکنیم و سپس انتظاراتمان را از آن بیان میکنیم. مثلاً فرض کنید آبجکتی به اسم FaxReceiver دارید که یکی از متودهایش وظیفه دارد به شما بگوید از تاریخ آخرین عوض کردن کاغذ دستگاه فاکس، چند عدد فاکس دریافت کرده است. متود مورد تست شما از این آبجکت استفاده میکند و هر وقت که تعداد فاکسهای دریافتی بیش از هزار عدد شد به اپراتور دستگاه پیغام دهد که موقع عوض کردن کاغذ دستگاه فرا رسیده است. با روشهای معمولی تست نمیتوان این متود را تست کرد مگر این که هزار عدد فاکس دریافت کنید. در اینجاست که از روشهای شبیهسازی مثل Mock استفاده میشود. برای این کار آبجکت FaxReceiver به Mock Framework معرفی شده و به او میگوییم هر وقت متود تعداد فاکسهای دریافتی فراخوانی شد از او «انتظار» داریم مقدار هزار را برگرداند.
مثال بالا را میتوان با Stub هم انجام داد. با این تفاوت که در مورد Stub هیچ Framework یا Library وجود ندارد و شما مجبور هستید همه یا بخشی از آبجکت/متود مورد نظر را خودتان بنویسید. مثلا متودی بنویسید که به جای مراجعه واقعی به دستگاه فاکس و خواندن تعداد فاکسهای دریافتی از آن، همیشه عدد هزار را برگرداند. با این که کار با Stub خیلی سختتر از کار با Mock است ولی بعضی حالات وجود دارند که فقط با Stub میشود آنها را پیادهسازی کرد. مثلاً وقتی که نگهداشتن State برای ما مهم باشد. به عنوان مثال فرض کنید در تست دیگری بخواهیم بدانیم چند بار متود فراخوانی تعداد فاکسهای دریافتی فراخوانی شده است. انجام این کار با Mocking امکانپذیر نیست و باید از روش Stub استفاده شود.
منابع:
Mocks Aren’t Stubs
Mock object
آشنايي با mocking frameworks (چارچوبهاي تقليد) – قسمت اول
آشنايي با mocking frameworks – قسمت دوم