PowerMock هو إطار عمل Java مفتوح المصدر يستخدم لإنشاء كائن وهمي في اختبار الوحدة. وهو يوسع أطر عمل المحاكاة الأخرى مثل EasyMock وMockito لتعزيز القدرات. يستخدم إطار عمل PowerMock محمل فئة مخصص وتقنيات معالجة كود البايت لتمكين الاستهزاء بالطرق الثابتة، والفئات النهائية، والأساليب النهائية، والأساليب الخاصة، والمنشئ، وإزالة المُهيئات الثابتة. الهدف الرئيسي من PowerMock هو توسيع واجهات برمجة التطبيقات الحالية ببعض الأساليب والتعليقات التوضيحية لتوفير ميزات إضافية تجعل اختبار الوحدة أمرًا سهلاً للغاية.
يوفر إطار عمل PowerMock فئة تسمى PowerMockito يستخدم لإنشاء كائنات وهمية ويبدأ التحقق والتوقع. يوفر PowerMockito وظيفة العمل مع واجهة برمجة تطبيقات انعكاس Java.
دعونا نفهم مفهوم PowerMock بمساعدة مثال.
مثال على PowerMock مع Mockito
سنقوم هنا بإنشاء مثال على PowerMock باستخدام أطر عمل Mockito وJUnit. لإنشاء مثال باستخدام PowerMock، نحتاج إلى اتباع الخطوات التالية.
الخطوة 1: قم بإضافة تبعيات PowerMock التالية في ملف pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
الخطوة 2: تطبيق التعليقات التوضيحية PowerMock
لاستخدام PowerMock مع Mockito، نحتاج إلى تطبيق ما يلي اثنين التعليقات التوضيحية في الاختبار:
@RunWith(PowerMockRunner.class): وهو نفس ما استخدمناه في الأمثلة السابقة. والفرق الوحيد هو أننا في المثال السابق استخدمنا MockitoUnitRunner.class، والآن سنستخدم PowerMockRunner.class لتمكين واجهات برمجة تطبيقات PowerMockito في الاختبار.
@PrepareForTest: يخبر PowerMock بإعداد بعض الفصول للاختبار. ويمكن تطبيقه على كل من فئات الاختبار وطرق الاختبار الفردية. يتضمن فئات ذات طرق نهائية أو ثابتة أو خاصة أو أصلية يمكن الاستهزاء بها.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
ملاحظة: الخطوتين المذكورتين أعلاه إلزاميتان لجميع الأمثلة التي سنقوم بإنشائها باستخدام PowerMock.
فيما يلي الأمثلة على PowerMock مع أطر عمل Mockito وJUnit.
1. السخرية ثابتة طُرق
في المثال التالي، سوف نسخر ثابتة طُرق.
الخطوة 1: إنشاء فئة تحتوي على ثابتة طريقة. لقد أنشأنا فئة بالاسم جدوى.
Utility.java
public class Utility { public static String staticMethod(String call) { return call; } }
الخطوة 2: قم بإنشاء حالة اختبار JUnit، باسم اختبار Powermock, لغرض الاختبار.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestStaticMethod_WithPowerMockito() { String call = ' Hi there, I'm using PowerMock with Mockito '; String callexpectation = ' Call Expectation for you. '; PowerMockito.mockStatic(Utility.class); PowerMockito.when(Utility.staticMethod(call)).thenReturn(callexpectation); String actualcall = Utility.staticMethod(call); assertEquals(callexpectation, actualcall); } }
انتاج |
يوضح الإخراج التالي أن الاختبار قيد التشغيل بنجاح.
يمكننا أيضًا التحقق من استدعاء الطريقة الثابتة أم لا باستخدام الأمر التحقق الثابت () طريقة PowerMockito، كما هو موضح أدناه.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. السخرية خاص طُرق
في المثال التالي، سنقوم بإنشاء نموذج وهمي خاص طُرق.
الخطوة 1: قم بإنشاء فئة تحتوي على أسلوب خاص. لقد أنشأنا فئة بالاسم جدوى وحدد أ خاص الطريقة والطريقة العامة (التي تُرجع كائن الطريقة الخاصة).
Utility.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
الخطوة 2: قم بإنشاء حالة اختبار JUnit باسم PowerMock_test لغرض الاختبار.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestPrivateMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; String expectedmessage = ' Using with EasyMock '; Utility mock =PowerMockito.spy(new Utility()); PowerMockito.doReturn(expectedmessage).when(mock, 'privateMethod', message); String actualmessage = mock.callPrivateMethod(message); assertEquals(expectedmessage, actualmessage); System.out.println(PowerMockito.verifyPrivate(getClass())); } }
انتاج |
يوضح الإخراج التالي أن الاختبار قيد التشغيل بنجاح.
3. السخرية أخير طُرق
في المثال التالي، سوف نسخر أخير طُرق.
الخطوة 1: إنشاء فئة تحتوي على أخير طريقة. لقد أنشأنا فئة باسم Utility وحددنا طريقة نهائية مسماة FinalMethod.
Utility.java
public class Utility { public final String finalMethod(String message) { return message; } }
الخطوة 2: قم بإنشاء حالة اختبار JUnit باسم Powermock_test لأغراض تجريبية.
Powermock_test.java
نموذج أيضا
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestFinalMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; Utility uti = PowerMockito.mock(Utility.class); PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(uti); Utility uti2 = new Utility(); PowerMockito.verifyNew(Utility.class).withNoArguments(); PowerMockito.when(uti2.finalMethod(message)).thenReturn(message); String message2 = uti2.finalMethod(message); Mockito.verify(uti2).finalMethod(message); assertEquals(message, message2); } }
انتاج |
يوضح الإخراج التالي أن الاختبار قيد التشغيل بنجاح.