कैसे मॉकिटो के साथ एक अंतिम वर्ग का मजाक उड़ाया जाए


218

मेरा एक अंतिम वर्ग है, कुछ इस तरह से:

public final class RainOnTrees{

   public void startRain(){

        // some code here
   }
}

मैं इस वर्ग को इस तरह से कुछ अन्य वर्ग में उपयोग कर रहा हूं:

public class Seasons{

   RainOnTrees rain = new RainOnTrees();

   public void findSeasonAndRain(){

        rain.startRain();

    }
}

और मेरे JUnit परीक्षण वर्ग के लिए Seasons.javaमैं कक्षा का मजाक बनाना चाहता हूं RainOnTrees। मैं मॉकिटो के साथ यह कैसे कर सकता हूं?


9
मॉकिटो इसकी अनुमति नहीं देता है, हालांकि पॉवरमॉक करता है।
fge

1
मॉकिटो 2.x के रूप में, मॉकिटो अब अंतिम वर्गों और विधियों का मजाक उड़ाने का समर्थन करता है।
केंट

जवाबों:


155

मॉकिटो v2 के साथ ही मॉकिंग फाइनल / स्टैटिक क्लास / मेथड संभव है।

इसे अपनी श्रेणी फ़ाइल में जोड़ें:

testImplementation 'org.mockito:mockito-inline:2.13.0'

यह Mockito v1 के साथ संभव नहीं है, से Mockito पूछे जाने वाले प्रश्न :

मॉकिटो की सीमाएं क्या हैं

  • जावा 1.5+ की आवश्यकता है

  • अंतिम कक्षाओं का मजाक नहीं उड़ा सकते

...


2
यह मेरे लिए स्काला (sbt संशोधनों के साथ) में काम नहीं किया।
माइक्रोसेडल

2
यह मेरे लिए पर्याप्त नहीं था। मुझे भी seld / test / Resources / mockito-extension / org.mockito.plugins.MockMaker बनाने के लिए इसमें "mock-maker-inline" के साथ baeldung.com/mockito-final
micydydel

204

मॉकिटो 2 अब अंतिम वर्गों और विधियों का समर्थन करता है !

लेकिन अभी के लिए यह एक "इनक्यूबेटिंग" फीचर है। इसे सक्रिय करने के लिए कुछ चरणों की आवश्यकता है जो कि मॉकिटो 2 में व्हाट्स न्यू में वर्णित हैं :

अंतिम वर्गों और विधियों का मजाक करना एक ऊष्मायन , ऑप्ट-इन सुविधा है। यह जावा एजेंट इंस्ट्रूमेंटेशन और सबक्लासिंग के संयोजन का उपयोग करता है ताकि इन प्रकारों की मॉकबिलिटी को सक्षम किया जा सके। चूंकि यह हमारे मौजूदा तंत्र के लिए अलग तरह से काम करता है और इसकी अलग-अलग सीमाएँ हैं और जैसा कि हम अनुभव और उपयोगकर्ता प्रतिक्रिया को इकट्ठा करना चाहते हैं, यह सुविधा उपलब्ध होने के लिए स्पष्ट रूप से सक्रिय होना था; यह src/test/resources/mockito-extensions/org.mockito.plugins.MockMakerएक लाइन वाली फाइल बनाकर मॉकिटो एक्सटेंशन तंत्र के माध्यम से किया जा सकता है :

mock-maker-inline

आपके द्वारा यह फ़ाइल बनाए जाने के बाद, मॉकिटो स्वचालित रूप से इस नए इंजन का उपयोग करेगा और एक कर सकता है:

 final class FinalClass {
   final String finalMethod() { return "something"; }
 }

 FinalClass concrete = new FinalClass(); 

 FinalClass mock = mock(FinalClass.class);
 given(mock.finalMethod()).willReturn("not anymore");

 assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());

बाद के मील के पत्थर में, टीम इस सुविधा का उपयोग करने का एक प्रोग्रामेटिक तरीका लाएगी। हम सभी अमूल्य परिदृश्यों के लिए समर्थन की पहचान करेंगे और प्रदान करेंगे। देखते रहें और कृपया हमें बताएं कि आप इस सुविधा के बारे में क्या सोचते हैं!


14
मुझे अभी भी एक त्रुटि मिलती है: मॉक / स्पाई क्लास android.content.ComponentName
मॉकिटो मॉकिटो

3
सुनिश्चित करें कि आपने org.mockito.plugins.MockMakerफ़ाइल को सही फ़ोल्डर में रखा है।
विंडराइडर

7
उपर्युक्त का पालन करने के बाद भी मुझे त्रुटि मिल रही है:
मॉकिटो

8
@villusion यह उत्तर किसी भी तरह से PowerMock से संबंधित नहीं है।
लाइन

6
मैंने इन निर्देशों का पालन किया लेकिन मैं अभी भी यह काम नहीं कर पाया, क्या किसी और को कुछ करना था?
फ्रेंको

43

आप मॉकिटो के साथ एक अंतिम वर्ग का मजाक नहीं उड़ा सकते, जैसा कि आप इसे खुद नहीं कर सकते।

मैं क्या करता हूं, अंतिम वर्ग को लपेटने और प्रतिनिधि के रूप में उपयोग करने के लिए एक गैर-अंतिम वर्ग बनाना है। इसका एक उदाहरण TwitterFactoryवर्ग है, और यह मेरा नकली वर्ग है:

public class TwitterFactory {

    private final twitter4j.TwitterFactory factory;

    public TwitterFactory() {
        factory = new twitter4j.TwitterFactory();
    }

    public Twitter getInstance(User user) {
        return factory.getInstance(accessToken(user));
    }

    private AccessToken accessToken(User user) {
        return new AccessToken(user.getAccessToken(), user.getAccessTokenSecret());
    }

    public Twitter getInstance() {
        return factory.getInstance();
    }
}

नुकसान यह है कि बहुत सारे बॉयलरप्लेट कोड हैं; लाभ यह है कि आप कुछ तरीकों को जोड़ सकते हैं जो आपके एप्लिकेशन व्यवसाय से संबंधित हो सकते हैं (जैसे getInstance जो उपर्युक्त मामले में एक एक्सेसटॉकन के बजाय एक उपयोगकर्ता ले रहा है)।

आपके मामले में मैं एक गैर-अंतिम RainOnTreesवर्ग बनाऊंगा जो अंतिम वर्ग को सौंपता है। या, यदि आप इसे गैर-अंतिम बना सकते हैं, तो बेहतर होगा।


6
+1। यदि वांछित है, तो आप @Delegateबहुत सारे बॉयलरप्लेट को संभालने के लिए लोम्बोक की तरह कुछ का उपयोग कर सकते हैं ।
बरबाद

2
@luigi आप उदाहरण के रूप में जूनिट के लिए कोड स्निपेट जोड़ सकते हैं। मैंने अपनी अंतिम कक्षा के लिए रैपर बनाने की कोशिश की, लेकिन यह नहीं बता पाया कि इसका परीक्षण कैसे किया जाए।
अतुल्य

31

इसे अपनी श्रेणी फ़ाइल में जोड़ें:

testImplementation 'org.mockito:mockito-inline:2.13.0'

यह अंतिम कक्षाओं के साथ मॉकिटो कार्य करने के लिए एक विन्यास है


1
शायद "testCompile" के बजाय अब "testImplementation" का उपयोग करना चाहिए। ग्रैडल को अब "testCompile" पसंद नहीं है।
jwehrle

महान टिप्पणी, धन्यवाद! testImplementation में संपादित किया गया। मूल टिप्पणी: testCompile 'org.mockito: mockito-inline: 2.13.0'
BennyP

2
Linux / OpenJDK 1.8 पर चलने पर यह त्रुटि उत्पन्न करता है:org.mockito.exceptions.base.MockitoInitializationException: Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)
naXa

ठीक काम करता है जब Oracle JDK 1.8
naXa

23

पावरमॉक का उपयोग करें। यह लिंक दिखाता है, यह कैसे करना है: https://github.com/jayway/powermock/wiki/MockFinal


30
मुझे लगता है कि पॉवरमॉक दवा के उन टुकड़ों में से एक है जो केवल "प्रिस्क्रिप्शन" बेस पर निकल जाना चाहिए। के अर्थ में: किसी को यह स्पष्ट करना चाहिए कि पावरमॉक में बहुत सारी समस्याएं हैं; और इसका उपयोग करना अंतिम अंतिम उपाय की तरह है; और जितना संभव हो उतना बचा जाना चाहिए।
घोस्टकट

1
आप क्यों कहते हो कि?
प्रागैमैटिकप्रोग्रामर

मैं Powermockअपने कवरेज को बढ़ाने के लिए अंतिम वर्गों और स्थिर तरीकों का मजाक उड़ाने के लिए उपयोग कर रहा था जो आधिकारिक तौर पर जाँच की गई थी Sonarqube। सोनारक्यूब के बाद कवरेज 0% था, जो कभी भी उस कारण से नहीं पहचाना जाता है जो इसके अंदर कहीं भी पावरमॉक का उपयोग करने वाली कक्षाओं को नहीं पहचानता है। मैंने मुझे और मेरी टीम को ऑनलाइन कुछ सूत्र से इसका एहसास कराने में काफी समय लिया। इसलिए कि पावरमॉक के साथ सावधानी बरतने के कारणों में से एक है और शायद इसका उपयोग न करें।
आमेर १

16

बस फॉलो करने के लिए। कृपया इस रेखा को अपनी श्रेणी फ़ाइल में जोड़ें:

testCompile group: 'org.mockito', name: 'mockito-inline', version: '2.8.9'

मैंने मॉकिटो-कोर और मॉकिटो-सभी के विभिन्न संस्करण आज़माए हैं। दोनों में से कोई भी काम नहीं करता है।


1
इसे जोड़ने के लिए, एक बात जो मैंने देखी, वह यह थी कि अगर आप मॉकिटो के साथ पॉवॉर्म का उपयोग कर रहे हैं; उसके बाद 'src / test / resource / mockito-extension / org.mockito.plugins.MockMaker' में मॉकमेकर प्लगइन फाइल जोड़ना अंतिम कक्षाओं के मॉकिंग में उपयोगी नहीं होगा। इसके बजाय, ऊपर माइकल_ज़ैंग द्वारा बताई गई निर्भरता को जोड़ने से अंतिम कक्षाओं का मजाक उड़ाने का मुद्दा हल हो जाएगा। इसके अलावा, सुनिश्चित करें कि आप मॉकिटो 1 के बजाय मॉकिटो 2 का उपयोग कर रहे हैं
डिश

12

मुझे लगता है कि आपने इसे बनाया है finalक्योंकि आप अन्य वर्गों को फैलने से रोकना चाहते हैं RainOnTrees। जैसा कि प्रभावी जावा सुझाव देता है (आइटम 15), एक वर्ग को बिना विस्तार के पास रखने का एक और तरीका है final:

  1. finalकीवर्ड निकालें ;

  2. इसका निर्माता बनाओ private। कोई भी वर्ग इसे विस्तारित करने में सक्षम नहीं होगा क्योंकि यह superकंस्ट्रक्टर को कॉल करने में सक्षम नहीं होगा ;

  3. अपनी कक्षा को त्वरित करने के लिए एक स्थिर कारखाना विधि बनाएँ।

    // No more final keyword here.
    public class RainOnTrees {
    
        public static RainOnTrees newInstance() {
            return new RainOnTrees();
        }
    
    
        private RainOnTrees() {
            // Private constructor.
        }
    
        public void startRain() {
    
            // some code here
        }
    }

इस रणनीति का उपयोग करके, आप मॉकिटो का उपयोग करने में सक्षम होंगे और अपनी कक्षा को थोड़ा बॉयलरप्लेट कोड के साथ विस्तार के लिए बंद रखेंगे।


1
यह अंतिम तरीकों के लिए काम नहीं करता है जिसमें मॉकिटो 2 के साथ भी मॉकडाउन किया जा सकता है।
23ukasz Rzeszotarski

11

मुझे भी यही समस्या थी। चूँकि मैं जिस वर्ग का मजाक उड़ाने की कोशिश कर रहा था वह एक साधारण वर्ग था, मैंने बस इसका एक उदाहरण बनाया और उसे वापस लौटा दिया।


2
बिल्कुल, एक साधारण वर्ग का मज़ाक क्यों? मॉकिंग 'महंगी' बातचीत के लिए है: अन्य सेवाएं, इंजन, डेटा कक्षाएं आदि
स्ट्रिपलाइट

3
यदि आप इसका एक उदाहरण बनाते हैं, तो आप इसके बाद Mockito.verify विधियों को लागू नहीं कर सकते। मोक्स का मुख्य उपयोग इसके कुछ तरीकों का परीक्षण करने में सक्षम होना है।
riroo

6

इसे आजमाइए:

Mockito.mock(SomeMockableType.class,AdditionalAnswers.delegatesTo(someInstanceThatIsNotMockableOrSpyable));

इसने मेरे लिए काम किया। "SomeMockableType.class" वह मूल वर्ग है जिसे आप नकली या जासूसी करना चाहते हैं, और someInstanceThatIsNotMockableOrSpyable वह वास्तविक वर्ग है जिसे आप नकली या जासूसी करना चाहते हैं।

अधिक जानकारी के लिए एक नजर है यहाँ


3
यह ध्यान दिया जाना चाहिए कि प्रतिनिधि देशी जासूस मॉकिंग से बहुत अलग हैं। एक देशी मॉकिटो जासूस में, "यह" उदाहरण के लिए जासूसी के संदर्भ में (क्योंकि उपवर्ग का उपयोग होता है) हालांकि, प्रतिनिधि में, "यह" वास्तविक वस्तु होगी कुछ InstanceThatIsNotMockableOrnpyable। जासूस नहीं। इस प्रकार, स्वयं-कॉलिंग कार्यों के लिए doReturn / Verify करने का कोई तरीका नहीं है।
डेनिस सी

1
क्या आप एक उदाहरण रख सकते हैं?
विश्व रत्न

5

एक अन्य वर्कअराउंड, जो कुछ मामलों में लागू हो सकता है, एक इंटरफ़ेस बनाना है जो उस अंतिम वर्ग द्वारा कार्यान्वित किया जाता है, कोड को कंक्रीट क्लास के बजाय इंटरफ़ेस का उपयोग करने के लिए परिवर्तित करें और फिर इंटरफ़ेस को मॉक करें। यह आपको अनुबंध (इंटरफ़ेस) को कार्यान्वयन (अंतिम वर्ग) से अलग करता है। बेशक, अगर आप जो चाहते हैं वह वास्तव में अंतिम वर्ग के लिए बाध्य है, तो यह लागू नहीं होगा।


5

वास्तव में एक तरीका है, जिसका इस्तेमाल मैं जासूसी के लिए करता हूं। यह आपके लिए तभी काम करेगा जब दो पूर्व शर्त संतुष्ट हों:

  1. अंतिम वर्ग के उदाहरण को इंजेक्ट करने के लिए आप किसी प्रकार के DI का उपयोग करते हैं
  2. अंतिम वर्ग एक इंटरफ़ेस लागू करता है

कृपया प्रभावी जावा से आइटम 16 को याद करें । आप एक आवरण (अंतिम नहीं) बना सकते हैं और सभी कॉल को अंतिम वर्ग के उदाहरण के लिए अग्रेषित कर सकते हैं:

public final class RainOnTrees implement IRainOnTrees {
    @Override public void startRain() { // some code here }
}

public class RainOnTreesWrapper implement IRainOnTrees {
    private IRainOnTrees delegate;
    public RainOnTreesWrapper(IRainOnTrees delegate) {this.delegate = delegate;}
    @Override public void startRain() { delegate.startRain(); }
}

अब आप न केवल अपने अंतिम वर्ग का मज़ाक उड़ा सकते हैं, बल्कि उसकी जासूसी भी कर सकते हैं:

public class Seasons{
    RainOnTrees rain;
    public Seasons(IRainOnTrees rain) { this.rain = rain; };
    public void findSeasonAndRain(){
        rain.startRain();
   }
}

IRainOnTrees rain = spy(new RainOnTreesWrapper(new RainOnTrees()) // or mock(IRainOnTrees.class)
doNothing().when(rain).startRain();
new Seasons(rain).findSeasonAndRain();

5

Mockito 3 और अधिक में मैं एक ही समस्या है और इसे इस लिंक से तय किया है

मॉकिटो के साथ मॉक फाइनल क्लासेस और तरीके फॉलो करें

इससे पहले कि मॉकिटो का इस्तेमाल अंतिम वर्गों और विधियों का मजाक उड़ाया जा सके, इसके लिए इसे> कॉन्फ़िगर करना होगा।

हमें प्रोजेक्ट की src / test / Resources / mockito-extension directory नाम org.mockito.plugins.MockMaker नाम से एक पाठ फ़ाइल जोड़ने की आवश्यकता है और पाठ की एक पंक्ति जोड़ें:

mock-maker-inline

मॉकिटो लोड होने पर कॉन्फ़िगरेशन फ़ाइलों के लिए एक्सटेंशन निर्देशिका की जांच करता है। यह फ़ाइल अंतिम विधियों और कक्षाओं की नकल करने में सक्षम बनाती है।


4

एंड्रॉइड + कोटलीन पर समान मुद्दे (मॉकिटो + फाइनल क्लास) का सामना कर रहे लोगों के लिए समय सेवर। जैसे कि कोटलिन कक्षाएं डिफ़ॉल्ट रूप से अंतिम होती हैं। मुझे आर्किटेक्चर घटक के साथ Google Android नमूनों में से एक में एक समाधान मिला। समाधान यहां से उठाया गया: https://github.com/googlesamples/android-altecture-compenders/blob/master/GithubBrowserSample

निम्नलिखित एनोटेशन बनाएं:

/**
 * This annotation allows us to open some classes for mocking purposes while they are final in
 * release builds.
 */
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class OpenClass

/**
 * Annotate a class with [OpenForTesting] if you want it to be extendable in debug builds.
 */
@OpenClass
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting

अपनी ढाल फ़ाइल को संशोधित करें। यहाँ से उदाहरण लें: https://github.com/googlesamples/android-altecture-compenders/blob/master/GithubBrowserSample/app/build.gradle

apply plugin: 'kotlin-allopen'

allOpen {
    // allows mocking for classes w/o directly opening them for release builds
    annotation 'com.android.example.github.testing.OpenClass'
}

अब आप इसे परीक्षण के लिए खोलने के लिए किसी भी वर्ग को एनोटेट कर सकते हैं:

@OpenForTesting
class RepoRepository 

यह ऐप स्तर बिल्ड.ग्रेड पर अच्छा काम करता है लेकिन लाइब्रेरी स्तर पर इसे प्राप्त करने के लिए हम क्या कर सकते हैं?
सुमित टी

क्या आप थोड़ा विस्तार कर सकते हैं? आमतौर पर, lib से जुड़ने के लिए मुखौटा पैटर्न का उपयोग करें। और ऐप का परीक्षण करने के लिए इन मुखौटा कक्षाओं का मजाक उड़ाएं। इस तरह हमें किसी भी कामगार वर्ग का मजाक उड़ाने की जरूरत नहीं है।
21

3

यह तब किया जा सकता है यदि आप मॉकिटो 2 का उपयोग कर रहे हैं, नए इनक्यूबेटिंग फ़ीचर के साथ जो अंतिम वर्गों और विधियों के मॉकिंग का समर्थन करता है।

नोट करने के लिए मुख्य बिंदु:
1. "org.mockito.plugins.MockMaker" नाम के साथ एक सरल फ़ाइल बनाएं और इसे "mockito- एक्सटेंशन" नामक फ़ोल्डर में रखें। यह फ़ोल्डर क्लासपाथ पर उपलब्ध कराया जाना चाहिए।
2. ऊपर बनाई गई फ़ाइल की सामग्री नीचे दी गई के अनुसार सिंगल लाइन होनी चाहिए:
मॉक-मेकर-इनलाइन

मॉकिटो एक्सटेंशन तंत्र को सक्रिय करने और इस ऑप्ट-इन सुविधा का उपयोग करने के लिए उपरोक्त दो चरणों की आवश्यकता है।

नमूना वर्ग इस प्रकार हैं: -

FinalClass.java

public final class FinalClass {

public final String hello(){
    System.out.println("Final class says Hello!!!");
    return "0";
}

}

Foo.java

public class Foo {

public String executeFinal(FinalClass finalClass){
    return finalClass.hello();
}

}

FooTest.java

public class FooTest {

@Test
public void testFinalClass(){
    // Instantiate the class under test.
    Foo foo = new Foo();

    // Instantiate the external dependency
    FinalClass realFinalClass = new FinalClass();

    // Create mock object for the final class. 
    FinalClass mockedFinalClass = mock(FinalClass.class);

    // Provide stub for mocked object.
    when(mockedFinalClass.hello()).thenReturn("1");

    // assert
    assertEquals("0", foo.executeFinal(realFinalClass));
    assertEquals("1", foo.executeFinal(mockedFinalClass));

}

}

आशा करता हूँ की ये काम करेगा।

पूरा लेख यहां प्रस्तुत है मॉकिंग-ऑफ-अनमॉक


आपको यहां उत्तर शामिल करना चाहिए और बाहरी साइट से लिंक नहीं करना चाहिए। यदि प्रक्रिया लंबी है तो आप एक अवलोकन शामिल कर सकते हैं।
रगोम

कृपया यह सुनिश्चित करें कि @RunWith (PowerMockRunner.class) @PrepareForTest ({AFinalClass.class}) का उपयोग करते समय नीचे दिए गए एनोटेशन का उपयोग करें
vCillusion

1
@vCillusion - मैंने जो उदाहरण दिखाया है वह सिर्फ मॉकिटो 2 एपीआई का उपयोग करता है। मॉकिटो 2 की ऑप्ट-इन सुविधा का उपयोग करके, कोई भी पावरमॉक का उपयोग करने की आवश्यकता के बिना सीधे अंतिम कक्षाओं का मजाक उड़ा सकता है।
ksl

2

यहाँ एक ही समस्या है, हम मॉकिटो के साथ एक अंतिम वर्ग का मजाक नहीं उड़ा सकते। सटीक होने के लिए, मॉकिटो निम्न प्रकार से जासूसी / जासूसी नहीं कर सकता है:

  • अंतिम कक्षाएं
  • अनाम वर्ग
  • आदिम प्रकार

लेकिन एक रैपर वर्ग का उपयोग करने से मुझे भुगतान करने की एक बड़ी कीमत लगती है, इसलिए इसके बजाय पावरमॉकिटो प्राप्त करें।


2

मुझे लगता है कि आपको सिद्धांत रूप में अधिक सोचने की आवश्यकता है। इसके बजाय आप अंतिम वर्ग उसके इंटरफेस और उसके बजाय नकली इंटरफ़ेस का उपयोग करें।

इसके लिए:

 public class RainOnTrees{

   fun startRain():Observable<Boolean>{

        // some code here
   }
}

जोड़ना

interface iRainOnTrees{
  public void startRain():Observable<Boolean>
}

और आप इंटरफ़ेस नकली:

 @Before
    fun setUp() {
        rainService= Mockito.mock(iRainOnTrees::class.java)

        `when`(rainService.startRain()).thenReturn(
            just(true).delay(3, TimeUnit.SECONDS)
        )

    }

1

कृपया JMockit को देखें । इसके कई उदाहरणों के साथ व्यापक प्रलेखन है। यहां आपके पास आपकी समस्या का एक उदाहरण समाधान है (सरल उदाहरण के Seasonsलिए मैंने नकली RainOnTreesउदाहरण को इंजेक्ट करने के लिए कंस्ट्रक्टर जोड़ा है ):

package jmockitexample;

import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class SeasonsTest {

    @Test
    public void shouldStartRain(@Mocked final RainOnTrees rain) {
        Seasons seasons = new Seasons(rain);

        seasons.findSeasonAndRain();

        new Verifications() {{
            rain.startRain();
        }};
    }

    public final class RainOnTrees {
        public void startRain() {
            // some code here
        }

    }

    public class Seasons {

        private final RainOnTrees rain;

        public Seasons(RainOnTrees rain) {
            this.rain = rain;
        }

        public void findSeasonAndRain() {
            rain.startRain();
        }

    }
}

1

RC और Luigi R. Viggiano द्वारा एक साथ दिए गए समाधान संभवतः सबसे अच्छा विचार है।

हालांकि मॉकिटो डिजाइन द्वारा, अंतिम वर्गों का मजाक नहीं उड़ा सकता है , प्रतिनिधिमंडल दृष्टिकोण संभव है । इसके फायदे हैं:

  1. आपको अपनी क्लास को नॉन-फ़ाइनल में बदलने के लिए मजबूर नहीं किया जाता है अगर ऐसा है तो आपकी एपीआई पहली जगह पर है (फाइनल क्लासेस के अपने फायदे हैं )।
  2. आप अपने एपीआई के चारों ओर सजावट की संभावना का परीक्षण कर रहे हैं ।

आपके परीक्षण के मामले में, आप जानबूझकर परीक्षण के तहत सिस्टम को कॉल अग्रेषित करते हैं। इसलिए, डिजाइन से, आपकी सजावट नहीं होती है कुछ भी करती है।

इसलिए आप परीक्षण यह भी प्रदर्शित कर सकते हैं कि उपयोगकर्ता केवल एपीआई का विस्तार करने के बजाय उसे सजा सकता है।

अधिक व्यक्तिपरक नोट पर: मैं फ्रेमवर्क को कम से कम रखना पसंद करता हूं, यही वजह है कि जेनिट और मॉकिटो आमतौर पर मेरे लिए पर्याप्त हैं। वास्तव में, इस तरह से प्रतिबंधित करना कभी-कभी मुझे अच्छे के लिए भी रिफ्लेक्टर के लिए मजबूर करता है।


1

आप के तहत इकाई परीक्षण चलाने का प्रयास करते हैं परीक्षण फ़ोल्डर के , तो शीर्ष समाधान ठीक है। बस इसे एक एक्सटेंशन जोड़कर पालन करें।

लेकिन अगर आप इसे एंड्रॉइड से संबंधित वर्ग जैसे संदर्भ या गतिविधि के साथ चलाना चाहते हैं जो कि androidtest फ़ोल्डर के अंतर्गत है , तो उत्तर आपके लिए है।


1

रन मॉकिटो के लिए इन निर्भरताओं को सफलतापूर्वक जोड़ें:

testImplementation 'org.mockito: mockito-core: 2.24.5'
testImplementation "org.mockito: mockito-inline: 2.24.5"


0

जैसा कि दूसरों ने कहा है, यह मॉकिटो के साथ बॉक्स से बाहर काम नहीं करेगा। मेरा सुझाव है कि परीक्षण के तहत कोड द्वारा उपयोग की जाने वाली वस्तु पर विशिष्ट फ़ील्ड सेट करने के लिए प्रतिबिंब का उपयोग किया जाए। यदि आप खुद को ऐसा करते हुए पाते हैं, तो आप इस कार्यक्षमता को एक लाइब्रेरी में लपेट सकते हैं।

एक तरफ के रूप में, यदि आप एक अंकन कक्षाएं अंतिम हैं, तो ऐसा करना बंद करें। मैं इस सवाल पर भाग गया क्योंकि मैं एक एपीआई के साथ काम कर रहा हूं जहां विस्तार (मजाक) के लिए मेरी वैध आवश्यकता को रोकने के लिए सब कुछ अंतिम रूप से चिह्नित किया गया था, और मैं चाहता हूं कि डेवलपर ने यह मान लिया था कि मुझे कभी भी कक्षा का विस्तार करने की आवश्यकता नहीं होगी।


1
एक्सटेंशन के लिए सार्वजनिक एपीआई कक्षाएं खुली होनी चाहिए। पूरी तरह से सहमत हैं। हालांकि, एक निजी कोड-बेस में, finalडिफ़ॉल्ट होना चाहिए।
एरिक

0

हमारे लिए, यह इसलिए था क्योंकि हमने कोइन-टेस्ट से मॉकिटो-इनलाइन को बाहर रखा था। एक ग्रेड मॉड्यूल वास्तव में इसकी आवश्यकता थी और कारण केवल रिलीज बिल्ड पर विफल रहा (आईडीई काम में डिबग बनाता है) :-P


0

अंतिम वर्ग के लिए मॉक और स्थिर या गैर स्थिर कॉल करने के लिए नीचे जोड़ें।

1- इसे क्लास लेवल में जोड़ें @SuppressStatucInitializationFor (value = {class name with package})
2- पॉवरमॉकिटो.mockStatic (classname.class) मॉक क्लास देगा
3- तब इस क्लास के मेथड कॉलिंग मेथड को वापस करने के लिए अपने स्टेटमेंट का इस्तेमाल तब करें जब मॉक ऑब्जेक्ट वापस आए।

का आनंद लें


-5

अंतिम प्रयास नहीं किया, लेकिन निजी के लिए, प्रतिबिंब का उपयोग कर संशोधक को हटा दिया! आगे जाँच की है, यह अंतिम के लिए काम नहीं करता है।


यह पूछे गए सवाल का जवाब नहीं दे रहा है
संजीत कुमार मिश्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.