इसलिए मुझे हमारी विकास टीम के लिए मॉकिंग और बीडीडी पर पढ़ने के लिए कहा गया है और हमारे मौजूदा यूनिट परीक्षणों (एक प्रयोग के रूप में) के मुकाबले में सुधार करने के लिए मैक्स के साथ खेलना है।मॉकिटो: "ब्लैकबॉक्स" निर्भरता का मजाक
मैंने आखिरकार मॉकिटो के साथ कई कारणों से (मेरे नियंत्रण के दायरे से बाहर) के लिए जाने का चयन किया है, लेकिन अर्थात् क्योंकि यह मॉकिंग के दौरान उदाहरण के लिए स्टबिंग और मॉकिंग दोनों का समर्थन करता है।
मैंने पूरे दिन मॉकिटो के बारे में सीखने, मजाक करने (सामान्य रूप से) और बीडीडी के बारे में सीखने में बिताया है। और अब मैं खोदने और हमारे यूनिट परीक्षणों को बढ़ाने के लिए तैयार हूं।
public class WebAdaptor {
private Subscriber subscriber;
public void run() {
subscriber = new Subscriber();
subscriber.init();
}
}
कृपया ध्यान दें:
तो हम एक वर्ग WebAdaptor
नामक एक run()
विधि है कि है (इस सवाल के दायरे से बाहर कारणों के लिए) मैं इस कोड को संशोधित करने के लिए एक रास्ता नहीं है । इस प्रकार मैं में Subscriber
के लिए एक सेटर विधि जोड़ने की क्षमता है, और इस प्रकार इसे मेरे WebAdaptor
के अंदर एक पहुंचने योग्य "ब्लैकबॉक्स" के रूप में सोचा जा सकता है।
मैं एक इकाई परीक्षण जो एक Mockito
नकली को शामिल किया गया, और कहा कि नकली करने के लिए verify
कि क्रियान्वित WebAdaptor::run()
का कारण बनता है Subscriber::init()
के नाम से जाना का उपयोग करता है लिखना चाहते हैं।
तो यहाँ क्या मैं (WebAdaptorUnitTest
अंदर) अब तक मिल गया है:
@Test
public void runShouldInvokeSubscriberInit() {
// Given
Subscriber mockSubscriber = mock(Subscriber.class);
WebAdaptor adaptor = new WebAdaptor();
// When
adaptor.run();
// Then
verify(mockSubscriber).init();
}
जब मैं इस परीक्षण चलाने के लिए, वास्तविक Subscriber::init()
विधि हो जाता है निष्पादित (मैं सांत्वना उत्पादन से बता सकते हैं और देख फ़ाइलें उत्पन्न किया जा रहा मेरे स्थानीय सिस्टम पर), mockSubscriber
, जो कुछ भी नहीं (या वापसी) नहीं करना चाहिए।
मैं जाँच की है और फिर से जांच की गई: init
, public
है न static
या final
है, और यह void
देता है। दस्तावेज़ों के मुताबिक, मॉकिटो को इस ऑब्जेक्ट को मजाक करने में कोई समस्या नहीं होनी चाहिए।
तो मुझे यह सोचने लगा: क्या मुझे adaptor
के साथ mockSubscriber
को स्पष्ट रूप से संबद्ध करने की आवश्यकता है? यह एक मामला है, तो आमतौर पर, निम्नलिखित सामान्य रूप से इसे ठीक होगा:
adaptor.setSubscriber(mockSubscriber);
लेकिन बाद से मैं किसी भी तरह के सेटर नहीं जोड़ सकते हैं (कृपया मेरी टिप्पणी से ऊपर पढ़ें), मुझे लगता है मैं कैसे कर सकता है के रूप में एक नुकसान में हूँ इस तरह के एक संघ को मजबूर करें। तो, कई बहुत करीबी से संबंधित प्रश्न:
- क्या कोई यह पुष्टि कर सकता है कि मैंने परीक्षण को सही तरीके से सेट किया है (मॉकिटो एपीआई का उपयोग करके)?
- क्या लापता सेटटर के बारे में मेरा संदेह सही है? (क्या मुझे इन ऑब्जेक्ट्स को एक सेटर के माध्यम से जोड़ने की ज़रूरत है?)
- यदि मेरा उपरोक्त संदेह सत्य है, और मैं
WebAdaptor
को संशोधित नहीं कर सकता, तो क्या मेरे निपटान में कोई circumventions हैं?
अग्रिम धन्यवाद!
यह सीधे आपके प्रश्न का उत्तर नहीं है, लेकिन JMockit बहुत आसान मजाक ब्लैक बॉक्स इस तरह का बना देता है। क्या JMock यह आपके लिए एक विकल्प है? –
सब्सक्राइबर इस वर्ग में कैसे तत्काल है? क्या आप जिस इंस्टेंस को नियंत्रित करते हैं उसे वापस करने के लिए तत्काल कोड को ओवरराइड करना संभव है? –
रन() एकमात्र तरीका है जो सब्सक्राइबर का उपयोग करता है, इसलिए हर तरह से यह उस विधि के अंदर एक स्थानीय चर होना चाहिए। दोबारा, मैं कोड नहीं बदल सकता ... – IAmYourFaja