سؤال

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

في اختبار بلدي، لقد حصلت على هذا الرمز:

// Mock the required objects
Document mDocument = mock(Document.class);
Element mRootElement = mock(Element.class);
Element mGeonameElement = mock(Element.class);
Element mLatElement = mock(Element.class);
Element mLonElement = mock(Element.class);

// record their behavior
when(mDocument.getRootElement()).thenReturn(mRootElement);
when(mRootElement.getChild("geoname")).thenReturn(mGeonameElement);
when(mGeonameElement.getChild("lat")).thenReturn(mLatElement);
when(mGeonameElement.getChild("lon")).thenReturn(mLonElement);
// A_LOCATION_BEAN is a simple pojo for lat & lon, don't care about it!
when(mLatElement.getText()).thenReturn(
    Float.toString(A_LOCATION_BEAN.getLat()));
when(mLonElement.getText()).thenReturn(
    Float.toString(A_LOCATION_BEAN.getLon()));

// let it work!
GeoLocationFetcher geoLocationFetcher = GeoLocationFetcher
    .getInstance();
LocationBean locationBean = geoLocationFetcher
    .extractGeoLocationFromXml(mDocument);

// verify their behavior
verify(mDocument).getRootElement();
verify(mRootElement).getChild("geoname");
verify(mGeonameElement).getChild("lat");
verify(mGeonameElement).getChild("lon");
verify(mLatElement).getText();
verify(mLonElement).getText();

assertEquals(A_LOCATION_BEAN, locationBean);

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

ولكن كيف يمكنني همية لخدمة ويب دون اعطاء everystep؟ يجب أن اسمحوا لي أن غرض مقلد فقط بإرجاع ملف XML؟

وانها ليست حول رمز، ولكن نهج .

وأنا باستخدام 4.x من أداة JUnit وMockito 1.7

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

المحلول

وكنت تريد حقا أن تكون ساخرا النتائج التي تم إرجاعها من خدمة ويب إلى التعليمات البرمجية التي سوف تستخدم النتيجة. وفي مثال التعليمات البرمجية أعلاه يبدو لك أن تكون ساخرا mDocument ولكن هل تريد حقا أن تمر في مثيل mDocument التي تم إرجاعها من المثال سخر من خدمة ويب الخاص بك، ويؤكدون أن locationBean عاد من geoLocationFetcher يطابق قيمة A_LOCATION_BEAN.

نصائح أخرى

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

وأنت قد تحتاج إلى إضافة وصول (ربما مستوى الحزمة) إلى فئة المفرد. على سبيل المثال إذا كان منشئ يبدو شيء من هذا القبيل

private GeoLocationFactory(WebService service) {
   ...
}

ويمكنك جعل مستوى حزمة منشئ ومجرد إنشاء واحد مع خدمة الإنترنت سخر.

وبدلا من ذلك يمكنك تعيين خدمة ويب بإضافة أسلوب اضع، على الرغم من أنني لا أحب سنغلتونس قابلة للتغيير. في هذه الحالة أيضا عليك أن تتذكر لإلغاء تعيين في خدمة ويب بعد ذلك.

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

ويمكنك أيضا أن ننظر إلى إزالة المفردة نفسها. هناك مقالات على شبكة الإنترنت وربما هنا على كيفية القيام بذلك.

والخيار الأسهل سيكون للسخرية العميل خدمة ويب،

when(geoLocationFetcher.extractGeoLocationFromXml(anyString()))
    .thenReturn("<location/>");

يمكنك تعديل التعليمات البرمجية لقراءة أكس استجابة من نظام الملفات.

ويمكن الاطلاع على نموذج التعليمات البرمجية هنا: الهزء. NET خدمات ويب مع Mockito

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