البرمجة

اختبار الـ Singleton باستخدام PowerMockito

في هذا السياق، يبدو أنك تحاول اختبار كلاس يستخدم نمط الـ Singleton، وتحديداً تجنب الاعتماد على Singleton الفعلي في اختبارك بسبب تعقيدات الاعتماد على الحالة العالمية في الاختبارات. بدلاً من ذلك، تحاول استخدام Mockito لوضع محاكاة (Mock) للـ Singleton وتحديد سلوكه المتوقع للاختبار.

لكن الخطأ الذي تواجهه يحدث بسبب طريقة الاستخدام الخاطئة لـ Mockito. عندما تحاول استخدام when() لتحديد سلوك الـ Singleton، يجب أن يكون هذا استدعاء لطريقة محددة على الـ Mock، لكن الـ Singleton ليس Mock في هذه الحالة، وإنما هو نمط تصميم.

لتجاوز هذه المشكلة، يمكنك استخدام تقنية تدعى “تحقيق الهدف (Target Stubbing)” لتحديد سلوك الـ Singleton. يتضمن ذلك استخدام PowerMockito مع Mockito لتمكين التلاعب بسلوك الطرق الثابتة (static methods)، مثل getInstance() في حالة Singleton.

هذا كيف يمكن تعديل الاختبار باستخدام PowerMockito:

java
@RunWith(PowerMockRunner.class) @PrepareForTest(FormatterService.class) public class TestDriverSnapshotHandler { @Test public void testFormatterServiceIsCalled() throws Exception { // Mock FormatterService FormatterService formatterMock = mock(FormatterService.class); when(formatterMock.formatTachoIcon()).thenReturn("MockedURL"); // Mock getInstance() method of FormatterService PowerMockito.mockStatic(FormatterService.class); when(FormatterService.getInstance()).thenReturn(formatterMock); // Invoke the method under test DriverSnapshotHandler handler = new DriverSnapshotHandler(); String result = handler.getImageURL(); // Verify that formatTachoIcon() was called verify(formatterMock, atLeastOnce()).formatTachoIcon(); // Verify the result assertEquals("MockedURL", result); } }

هذا التعديل يستخدم PowerMockito لتمكين تحديد سلوك طريقة getInstance() في الـ Singleton، مما يسمح لنا بالتحكم في إعادة القيمة المتوقعة منها وتحديد سلوكها المتوقع.

المزيد من المعلومات

بالطبع، دعني أوضح بعض المعلومات الإضافية حول كيفية عمل PowerMockito وكيف يتم استخدامه مع Mockito لاختبار الكلاسات التي تعتمد على الـ Singletons والطرق الثابتة.

PowerMockito هو إضافة Mockito تمكن من اختبار الكود الذي يعتمد على الطرق الثابتة (static methods)، الطرق النهائية (final methods)، والبناء (constructors)، وغيرها من السلوكيات الصعبة التي لا يمكن اختبارها بسهولة باستخدام Mockito وحدها.

للاستفادة من PowerMockito، يحتاج المطورون إلى تضمين تعليمات @RunWith(PowerMockRunner.class) و @PrepareForTest في اختباراتهم. يستخدم @PrepareForTest لتحديد الكلاسات التي يتعين عليها PowerMockito التدخل في سلوكها.

باستخدام PowerMockito، يمكن للمطورين محاكاة سلوك الـ Singleton وتحديد القيم التي يجب إرجاعها عند استدعاء الطرق الثابتة. في الحالة التي ذكرتها، يتم استدعاء طريقة getInstance() لإنشاء الـ Singleton، ولكن باستخدام PowerMockito يمكننا تحديد السلوك المتوقع لهذه الطريقة ليتم إرجاع Mock بدلاً من الـ Singleton الفعلي.

بالإضافة إلى ذلك، يجب أن يتم تهيئة بيئة الاختبار لتدعم PowerMockito، وهذا يتطلب إضافة التبعيات الصحيحة إلى ملفات POM.xml لمشروعك، والتأكد من استخدام إصدارات متوافقة من PowerMockito و Mockito معًا.

باختصار، باستخدام PowerMockito مع Mockito، يمكن للمطورين اختبار الكود الذي يعتمد على الـ Singletons والطرق الثابتة بطريقة فعالة ومنظمة، مما يسمح لهم بتطوير تطبيقات موثوقة وقابلة للصيانة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر