पॉवरमॉकिटो सिंगल स्टैटिक मेथड और रिटर्न ऑब्जेक्ट


98

मैं एक स्टैटिक मेथड m1 को क्लास से मॉक करना चाहता हूं जिसमें 2 स्टैटिक मेथड्स, m1 और m2 हैं। और मैं एक वस्तु को वापस करने के लिए विधि m1 चाहता हूं।

मैंने निम्नलिखित की कोशिश की

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

यह एम 1 और एम 2 दोनों को बुला रहा है, जिसमें एक अलग रिटर्न प्रकार है, इसलिए यह रिटर्न टाइप मिसमैच त्रुटि देता है।

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); लेकिन यह नहीं कहा जाता है जब एम 1 निष्पादित होता है।

3) PowerMockito.mockPartial(Static.class, "m1"); कंपाइलर त्रुटि देता है जो मॉकपार्टियल उपलब्ध नहीं है, जो मुझे http://code.google.com/p/powermock/wiki/MockitoUsage से मिला है ।

जवाबों:


135

आप जो करना चाहते हैं वह 1 और 2 के भाग का एक संयोजन है।

किसी वर्ग के सभी स्थिर तरीकों के लिए स्थैतिक मॉकिंग को सक्षम करने के लिए आपको PowerMockito.mockStatic का उपयोग करने की आवश्यकता है । इसका मतलब यह है कि जब-तब पुनर्जन्म वाक्यविन्यास का उपयोग करके उन्हें स्टब करना संभव है।

लेकिन जो आप मॉकिटो / पावरमॉक करते हैं, उसके लिए एक डिफ़ॉल्ट रणनीति की आपूर्ति करते हुए मॉकस्टैटिक के 2-तर्क अधिभार का उपयोग करना चाहिए जब आप ऐसी विधि कहते हैं जिसे आपने मॉक उदाहरण पर स्पष्ट रूप से नहीं लिखा है।

से जावाडोक :

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

डिफ़ॉल्ट डिफ़ॉल्ट छोटा करते रणनीति सिर्फ वापसी अशक्त, 0 या वस्तु, संख्या के लिए गलत पर है और महत्वपूर्ण तरीकों बूलियन। 2-arg अधिभार का उपयोग करके, आप कह रहे हैं "नहीं, नहीं, नहीं, डिफ़ॉल्ट रूप से डिफ़ॉल्ट मान प्राप्त करने के लिए इस उत्तर उपवर्ग की उत्तर विधि का उपयोग करें। यह एक लंबा लौटाता है, इसलिए यदि आपके पास स्थिर विधियां हैं जो कुछ असंगत वापस आती हैं। लंबे समय से, एक समस्या है।

इसके बजाय, स्थैतिक विधियों के स्टबिंग को सक्षम करने के लिए मॉकस्टैटिक के 1-आरजी संस्करण का उपयोग करें, फिर किसी विशेष विधि के लिए क्या करना है यह निर्दिष्ट करने के लिए जब-तब पुन: उपयोग करें। उदाहरण के लिए:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

स्ट्रिंग-वेल्यूड स्टैटिक मेथड "हेलो!" को वापस करने के लिए स्टबल किया जाता है, जबकि इंट-वेल्यूड स्टैटिक मेथड डिफॉल्ट स्टबिंग का उपयोग करता है, 0 लौटाता है।


1
क्या रीप्ले की कोई ज़रूरत नहीं है?
बालाजी बोगाराम रामनारायण

हम्म ... सॉर्टा ऐसा लगता है। हो सकता है कि PowerMockito आपके लिए PowerMock रीप्ले करे? मुझे भी आश्चर्य होता है।
djangofan 20

3
लेकिन क्या होगा अगर मुझे यह सुनिश्चित करने की आवश्यकता है कि कुछ स्थिर विधि सटीक तर्कों के साथ कहलाती है?
एलोमेटो

6
@PrepareForTestएनोटेशन वर्ग होना चाहिए कि कॉल स्थिर विधि, नहीं वर्ग जहां स्थिर तरीका है।
हेज़ल ट्रॉस्ट

5
@ हेज़लट्रॉस्ट - नहीं, ओपी सही है। यह स्थिर पद्धति वाला वर्ग है जिसे परीक्षण के लिए तैयार किया जाना चाहिए। तो, @PrepareForTest(ClassWithStatics.class)सही है।
arry36
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.