عندما يتعلق الأمر باختبار وحدة الأكواد التي تحتوي على تفاعلات معطوفة على شروط، مثل البيانات المنطقية في بلوكات if، فإن Mockito يقدم مجموعة من الطرق للتأكد من تنفيذ هذه الشروط بشكل صحيح أثناء الاختبار. لكن قبل الشروع في إنشاء الاختبارات، يجب أن تكون الأكواد التي تُختبر مرنة بما يكفي لتمكين الاختبار.
في الحالة التي وضعتها، الوظيفة doSomething() تحتوي على شرط if تتحقق منه قبل تنفيذ قطعة معينة من الكود. بما أن هذه الوظيفة لا تعيد أي قيمة (void)، فمن المحتمل أن تكون الصعوبة في اختبار ما إذا كانت البلوك if قد تم تنفيذها أم لا.
لحل هذه المشكلة، يمكن استخدام Mockito بالاعتماد على ميزاته المتقدمة لفحص سلوك الكائنات المزيفة. يمكن أن يكون الحل كالتالي:
-
إعادة هيكلة الكود لجعله أكثر قابلية للاختبار. يمكن تغيير الوظيفة doSomething() لتقوم بإرجاع قيمة مناسبة (مثل boolean) تشير إلى ما إذا كان الشرط قد تم تنفيذه أم لا.
-
استخدام Mockito لإنشاء كائن مزيف للاختبار (Mock Object) لاختبار سلوك الوظيفة. يمكن استخدام Mockito لتجسيم واجهة doThis() للتحقق مما إذا تم استدعاءها أم لا.
لتطبيق هذا النهج، يمكن تغيير الشفرة لتصبح كالتالي:
javapublic class MyClass {
private final Dependency dependency;
public MyClass(Dependency dependency) {
this.dependency = dependency;
}
public boolean doSomething() {
if (someCondition) {
int foo = doThis();
return true;
}
return false;
}
private int doThis() {
return dependency.doThat();
}
}
public interface Dependency {
int doThat();
}
ثم، في الاختبار:
javaimport static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private Dependency dependencyMock;
@InjectMocks
private MyClass myClass;
@Test
public void testDoSomething_ifConditionMet() {
// Arrange
when(dependencyMock.doThat()).thenReturn(100); // تخيل القيمة المطلوبة هنا
// Act
boolean result = myClass.doSomething();
// Assert
assertTrue(result); // التأكد من أن الشرط تم تنفيذه
verify(dependencyMock).doThat(); // التأكد من استدعاء الوظيفة الثانية
}
@Test
public void testDoSomething_ifConditionNotMet() {
// Arrange
// تخيل تكوين البيئة لعدم تحقق الشرط هنا
// Act
boolean result = myClass.doSomething();
// Assert
assertFalse(result); // التأكد من عدم تنفيذ الشرط
verifyNoInteractions(dependencyMock); // التأكد من عدم استدعاء الوظيفة الثانية
}
}
باستخدام Mockito، يمكنك فحص سلوك الوظائف المختلفة والتأكد من تنفيذ الشرط if بشكل صحيح. هذا يسمح ببناء اختبارات فعالة وشاملة لتطبيقاتك.
المزيد من المعلومات
بالتأكيد، سأكمل المقال بإضافة المزيد من التفاصيل والشروحات:
التفاصيل الإضافية حول استخدام Mockito:
Mockito هو إطار عمل اختبار وحدات Java يتيح للمطورين إنشاء مزيفات لكائنات Java وتحديد سلوكها في وقت التشغيل. يتيح لك Mockito تجنب اختبار التكامل الحقيقي مع الأنظمة الخارجية (مثل قواعد البيانات أو الخدمات الخارجية) عن طريق تزوير هذه الانتقالات الخارجية.
كيف يعمل الاختبار باستخدام Mockito:
-
تهيئة الاختبار (Test Setup): في بداية الاختبار، تقوم بإعداد السيناريو اللازم لاختبار الدالة المستهدفة. هذا يشمل إنشاء الكائنات الضرورية وتحديد سلوكها باستخدام Mockito.
-
تغيير حالة الاعتمادية (Stubbing): بعد تهيئة الاختبار، قد تحتاج إلى تغيير سلوك كائنات الاعتمادية لتكوينها بحيث تستجيب بالطريقة المطلوبة خلال الاختبار. هذا يشمل تغيير القيم المسترجعة من الدوال أو تحديد سلوك الدوال المزيفة.
-
تشغيل الدالة المستهدفة (Invoking the Target Function): بعد التحضير، يتم استدعاء الدالة المستهدفة التي تريد اختبارها.
-
التحقق (Verification): في هذه المرحلة، تحقق من السلوك المتوقع للكائنات المزيفة باستخدام Mockito. يمكنك التحقق مما إذا تم استدعاء الدوال المزيفة بالشكل الصحيح، أو تم استخدامها بعدد معين من المرات، أو حتى التحقق من الوسائط التي تم تمريرها إليها.
مثال على استخدام Mockito لاختبار الشرط “if”:
في الكود المعطى في المثال، إذا كنت تريد اختبار ما إذا تم تنفيذ الشرط if
عندما يكون someCondition
صحيحًا، يمكنك استخدام Mockito لتزوير المكالمة للدالة doThis()
والتحقق من أنها تمت بنجاح.
java@Test
public void testDoSomething() {
// تهيئة
MyClass myClass = new MyClass();
MyClass spy = Mockito.spy(myClass); // تزوير الكائن
// تغيير حالة الاعتمادية (Stubbing)
Mockito.when(spy.doThis()).thenReturn(100); // تنفيذ المكالمة المزيفة
// تشغيل الدالة التي تريد اختبارها
spy.doSomething();
// التحقق من أن المكالمة تمت بنجاح عندما يكون الشرط صحيحًا
Mockito.verify(spy, Mockito.times(1)).doThis();
}
الاستنتاج:
Mockito هو أداة قوية لاختبار وحدات التطبيق، تسمح للمطورين بتحديد سلوك كائنات الاعتمادية والتحقق من التفاعل معها بطريقة بسيطة وفعالة. باستخدام Mockito، يمكنك ضمان أن شروطك وتفاعلاتك تعمل بشكل صحيح في جميع الحالات الممكنة، مما يساعد في زيادة جودة وموثوقية تطبيقاتك.