unit testing क्या मॉकिटो को कोटिन के बिना वर्ग के बिना उपयोग करना संभव है?




unit-testing mocking (3)

जैसा कि हम शायद जानते हैं, डिफ़ॉल्ट रूप से एक बार कोटलिन क्लास द्वारा परिभाषित किया गया, यह अंतिम है, जब तक कि इसे स्पष्ट रूप से open घोषित किया जाता open

यह एक चुनौती के बाद होगा जब हम मोकीटो का उपयोग करके इसे मॉक करना चाहते हैं। हमें स्पष्ट रूप से इसे open रूप में घोषित करना होगा। क्या ऐसा कोई रास्ता नहीं है जो हम इसे अपने परीक्षण के लिए नकली करने में सक्षम होने के रूप में इसे open घोषित करने से बच सकें?


तीन तरह से मुझे पता है कि आप Kotlin वर्गों को कैसे नकली कर सकते हैं:

  1. वर्गों के बजाय इंटरफेस का उपयोग करें इस मामले में आप संबंधित इंटरफ़ेस के साथ किसी विशेष वर्ग के सभी उपयोगों को प्रतिस्थापित करते हैं। और परीक्षण कोड में आप इंटरफ़ेस का नकली करें।

    interface Something { /* ... */ }
    
    class SomethingImpl : Something { /* ... */ }
    
    fun processSomething(something: Something) { /* ... */ }
    
    val something = mock(Something::class.java)
    processSomething(mock)
  2. कक्षाएं खोलें, जो बहुत सुविधाजनक नहीं है

  3. मोकिको के बजाय पावरमॉक का उपयोग करें अपने ClassLoader का उपयोग करके आप ClassLoader से ज्यादा कुछ कर सकते हैं

मैं पहला दृष्टिकोण पसंद करता हूं क्योंकि कक्षाओं के बजाय इंटरफेस के साथ काम करने का यह एक अच्छा विचार है, भले ही आप चौंकाने वाले चौखटे का उपयोग न करें।


एस्प्रेसो परीक्षण चलाने पर MockMaker प्लगिन काम करने के लिए प्रतीत नहीं होता। इसलिए, आप इसके बजाय कोटलिन के सभी खुले पागिन का उपयोग कर सकते हैं।

Build.gradle में प्लगइन जोड़ें:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-allopen"

उस एनोटेशन को निर्दिष्ट करें जो कक्षा को खोल देगा:

allOpen {
    annotation("com.my.MyMockable")
}

अपनी एनोटेशन बनाएं, जिसका प्रयोग कक्षाओं को एनोटेट करने के लिए किया जा सकता है:

@Target(AnnotationTarget.CLASS)
annotation class MyMockable

इसके बाद, अपने वर्ग और इसके सार्वजनिक तरीकों को मोकाबल (खुला) बनाने के लिए, इसे अपनी टिप्पणी के साथ टिप्पणी दें:

@MyMockable

Mockito2 अब भी अंतिम कक्षाओं का नकली कर सकता है

हालांकि, यह सुविधा ऑप्ट-इन है , इसलिए आपको इसे मैन्युअल रूप से सक्षम करने की आवश्यकता है।
ऐसा करने के लिए, आपको एक फाइल / /mockito-extensions/org.mockito.plugins.MockMaker mock-maker-inline /mockito-extensions/org.mockito.plugins.MockMaker को परिभाषित करने की आवश्यकता है। /mockito-extensions/org.mockito.plugins.MockMaker जिसमें लाइन mock-maker-inline

उदाहरण के लिए देखें
http://hadihariri.com/2016/10/04/Mocking-Cotlin-With-Mockito/ या https://github.com/mockito/mockito/wiki/What%27s-new-in-Mokeito-2#unmockable
एक त्वरित परिचय के लिए

एक तरफ नोट पर, यह वर्तमान में एंड्रॉइड के लिए काम नहीं करता है





kotlin