मजाक आम तौर पर अच्छी तरह से काम करता है, तो आप अपनी सेवाओं तक तार की नियंत्रण और निर्भरता इंजेक्शन का प्रतिलोम का उपयोग करें। तो अपने व्यक्ति
public class Person() {
WebService ws = null;
// or use setters instead of constructor injection
Persion(WebService ws) {
this.ws = ws;
}
public Person find(int id) {
return ws.getPersonById(id);
}
}
की तरह दिखना चाहिए उम्मीद है कि यह स्पष्ट है कि इस परिवर्तन के साथ, अब आप WebService के लिए एक नकली और नकली नियंत्रण बना सकते हैं और बस इसे अपने परीक्षण में में प्लग, क्योंकि जब आप परीक्षण करने के लिए व्यक्ति को बनाने के , आप निर्माता को मॉक में पास कर सकते हैं (या अगर आप उस मार्ग पर जाते हैं तो सेटटर)।
अपने वास्तविक वातावरण में आईओसी कंटेनर, अब असली वेब सेवा इंजेक्षन जाएगा।
यदि आप यह सब आईओसी सामान के साथ सौदा नहीं करना चाहते, तो आप क्या करने की जरूरत से अपने वेब सेवा दसगुणा है आपका व्यक्ति (जिसे व्यक्ति सेवा या कुछ कहा जाना चाहिए, न केवल व्यक्ति, जो इकाई को दर्शाता है)। दूसरे शब्दों में, जिस तरह से कोड लिखा गया है, आप केवल एक प्रकार की वेब सेवा का उपयोग कर सकते हैं। आप ऐसा व्यक्ति सिर्फ WebService की कुछ प्रकार, नहीं विशिष्ट एक आप में हार्ड-कोडेड है की जरूरत है बनाने की जरूरत है।
अंत में, कोड लिखा के रूप में, WebService एक वर्ग है, नहीं एक अंतरफलक है। वेब सेवा एक इंटरफ़ेस होना चाहिए, और आपको किसी प्रकार के कार्यान्वयन में रखना चाहिए। EasyMock इंटरफेस के साथ अच्छी तरह से काम करता है; यह कंक्रीट कक्षाओं का नकल करने में सक्षम हो सकता है (थोड़ी देर के बाद से मैंने वास्तव में इसका इस्तेमाल किया), लेकिन एक डिजाइन सिद्धांत के रूप में आपको आवश्यक इंटरफ़ेस निर्दिष्ट करना चाहिए, कंक्रीट क्लास नहीं।
कहने के लिए खेद है, लेकिन यह एक शर्म की बात है। आईएमएचओ परीक्षण संचालित विकास के बारे में महान चीजों में से एक यह है कि आपको अपने डिजाइन को सोचने और पुनर्विचार करने के लिए मजबूर होना पड़ता है। ऐसा कुछ ढूंढना जो इंटरफेस के खिलाफ आसानी से टेस्टेबल नहीं है कोड गंध का एक अच्छा संकेत है। @ hvgotcodes ने एक अच्छा रास्ता निर्धारित किया है, आप कैसे अपना कोड अधिक रखरखाव, लचीला और टेस्टेबल बना सकते हैं। मैं इसे सिर्फ एक कामकाज के लिए फेंकना नहीं चाहता। –