سؤال

لدي أسلوب إرجاع الفراغ في فئة تبعية الدرجة أريد أن الاختبار.

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

أنا لا يمكن العثور على طريقة للقيام بذلك في EasyMock.أعتقد أنني أعرف كيف نفعل ذلك مع Mockito باستخدام doAnswer ولكن لا ترغب في إضافة مكتبة أخرى إلا عند الضرورة القصوى.

هل كانت مفيدة؟

المحلول

إذا أنا أفهم ما تريد القيام به بشكل صحيح، يجب أن تكون قادرا على استخدام andAnswer():

mockObject.someMethod(eq(param1), eq(param2));
expectLastCall().andAnswer(new IAnswer() {
    public Object answer() {
        //supply your mock implementation here...
        SomeClass arg1 = (SomeClass) getCurrentArguments()[0];
        AnotherClass arg2 = (AnotherClass) getCurrentArguments()[1];
        arg1.doSomething(blah);
        //return the value to be returned by the method (null for void)
        return null;
    }
});

EasyMock دليل المستخدم قائلا:

<اقتباس فقرة>   

إنشاء إرجاع قيم أو الاستثناءات

     

وأحيانا نود كائن وهمي لدينا لإرجاع قيمة أو رمي استثناء الذي تم إنشاؤه في وقت المكالمة الفعلية. منذ EasyMock 2.2، الكائن عاد من expectLastCall() و <أ href ل = "http://easymock.org/api/org/easymock/EasyMock.html#expect-T-" يختلط = "noreferrer"> expect(T value) يوفر طريقة <لأ href = "HTTP: // easymock. غزاله / المعهد / المنظمة / easymock / IExpectationSetters.html # andAnswer-org.easymock.IAnswer- "يختلط =" noreferrer "> andAnswer(IAnswer answer) الذي يسمح [أنت] لتحديد تطبيق واجهة <أ href = على" HTTP : //easymock.org/api/org/easymock/IAnswer.html "يختلط =" noreferrer "> يتم استخدام IAnswer أن لخلق قيمة الإرجاع أو استثناء

     

IAnswer رد، هي الحجج التي تم تمريرها إلى الدعوة وهمية المتاحة عبر EasyMock.getCurrentArguments() . إذا كنت تستخدم هذه، refactorings مثل المعلمات إعادة ترتيب قد كسر الاختبارات الخاصة بك. كنت قد حذر.

نصائح أخرى

إذا كنت مجرد دعوة باطلة الطريقة في كل مرة كنت أتوقع أن يكون الاحتجاج ثم الاحتجاج EasyMock.expectLastCall() قبل الاتصال replay(), Easymock "تذكر" كل استدعاء.

لذلك أنا لا أعتقد أنك تحتاج أن تدعو صراحة expect() (بخلاف lastCall) منذ كنت لا تتوقع أي شيء من الفراغ الأسلوب ، باستثناء في الاحتجاج.

شكرا كريس!

"المرح مع EasyMock" قبل زملائه ستاكوفيرفلوو المستخدم بيرت بيكويث هو جيد بلوق وظيفة التي توفر مزيد من التفاصيل.أبرز مقتطفات:

في الأساس تدفق أنني أميل إلى استخدام هو:

  1. إنشاء نموذج
  2. الاتصال expect(mock.[method call]).andReturn([result]) لكل المكالمة المتوقعة
  3. الاتصال mock.[method call], ثم EasyMock.expectLastCall() لكل من المتوقع الفراغ الاتصال
  4. الاتصال replay(mock) للتبديل من "سجل" وضع "تشغيل" وضع
  5. حقن وهمية حسب الحاجة
  6. دعوة طريقة الاختبار
  7. الاتصال verify(mock) أن أؤكد أن جميع المكالمات حدث

إذا كنت تريد فقط الحصول على المعلمات في وقت لاحق، قد نقدر أيضا في يلتقط الطبقة حيث هو جديد لEasyMock 2.4.

ويمكنك استخدام مثيل من فئة "لقطة" بدلا من المنظر. عندما يتم استدعاء الأسلوب الخاص سخر، فإن المثال التقاط تخزين معلمة تم استدعاء معها.

Capture<ChartPanel> captured = new Capture<ChartPanel>();
// setChartPanel is going to be called during execution;
// we want to verify some things about the ChartPanel
// instance it's invoked with
chartMock.setChartPanel(capture(captured));
replay(chartMock);

ufdm.setChartAnnotater(chartMock);
// afterPropertiesSet triggers the setChartPanel call...
ufdm.afterPropertiesSet();
verify(chartMock);

// verify some things about the ChartPanel parameter our
// mock object was invoked with
assertSame(plot, captured.getValue().getChart().getPlot());

وأنت قد ترغب في التحقق من PowerMock. ويستند EasyMock على API انعكاس وكيل يعني كل شيء وكيل ويمكنك فقط اجهات الاختبار، وبالتالي أساليب والطبقات غير النهائية فقط. قد يعمل هذا بالنسبة للبعض، ولكن إذا كنت اختبار العالم كما بنيت، ستحتاج المزيد من السلطة.

ومع PowerMock والأجهزة API جافا 5 يزيل القيود. لا حاجة لكتابة تطبيقات وجوه وهمية للكائن لفحصها (فقط قبيحة IMO). زوجان PowerMock مع Mockito (أو JMockit) وسوف يكون حقا خارج السباقات.

وبطبيعة الحال، هناك الاتجاه الآخر من إعادة كتابة التعليمات البرمجية ليتم اختبارها بشكل أكثر سهولة، وهو عموما فكرة جيدة جدا، إذا أمكن ذلك.

في مثل هذه الحالات لقد وجدت أن جعل فئة متداخلة في صفي وحدة اختبار وتجاوز الأساليب مع المتطلبات الخاصة بهذه الطريقة هو أفضل طريق. حتى إذا كنت اختبار ClassA التي لديها هذه الطريقة مع المعلمات تحتاج إلى الوصول، وكنت تفعل شيئا مثل:

class MockClassA extends ClassA {
    @Override
    void specialMethod(String param1, String param2) {
        // do logging or manipulation of some sort
        super.specialMethod(param1,param2); // if you need to
    }
}

في قانون بلدي وحدة الاختبار، وبعد ذلك فقط استخدام هذا المثال بدلا من ذلك. مجرد التعامل معها كما لو كانت أي وجوه وهمية أخرى. أسهل بكثير من الخلط والمكتبات، التي أوافق على الأرجح ليست فكرة جيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top