PowerMockito.whenNew () का उपयोग करते हुए नकली नहीं किया जा रहा है और मूल विधि कहा जाता है


100

मेरा कोड कुछ इस तरह है:

Class A {
  public boolean myMethod(someargs) {
    MyQueryClass query = new MyQueryClass();
    Long id = query.getNextId();
    // some more code
  }
}
Class MyQueryClass     {
  ....
  public Long getNextId() {
    //lot of DB code, execute some DB query
    return id;
  }
}

अब मैं एक परीक्षा के लिए लिख रहा हूँ A.myMethod(someargs)। मैं वास्तविक विधि को छोड़ना चाहता हूं query.getNextId()और इसके बजाय एक स्टब मान लौटाता हूं । मूल रूप से, मैं मजाक करना चाहता हूं MyQueryClass

इसलिए मेरे परीक्षण के मामले में, मैंने उपयोग किया है:

MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);

boolean b = A.getInstance().myMethod(args);

//asserts

मैंने प्रयोग किया @RunWith(PowerMockRunner.class)और @PrepareForTest({MyQueryClass.class})अपनी टेस्ट क्लास की शुरुआत में।

लेकिन जब मैं परीक्षण डिबग, यह अभी भी वास्तविक विधि बुला रहा है getNextId()के MyQueryClassवर्ग।

मुझे यहां क्या समझ नहीं आ रहा है? किसी को भी मदद कर सकते हैं के रूप में मैं Mockito और PowerMockito के लिए नया हूँ।

जवाबों:


220

आपको उस वर्ग को डालने की आवश्यकता है जहां निर्माणकर्ता को@PrepareForTest उस वर्ग के बजाय एनोटेशन में बुलाया जाता है जो निर्माण किया जा रहा है - नई वस्तुओं का मॉक निर्माण देखें ।

आपके मामले में:

@PrepareForTest(MyQueryClass.class)

@PrepareForTest(A.class)

ज़्यादा सामान्य:

@PrepareForTest(NewInstanceClass.class)

@PrepareForTest(ClassThatCreatesTheNewInstance.class)


1
बहुत बहुत धन्यवाद। यह @PrepareForTest में वर्तमान वर्ग Eg A को शामिल करने के बाद अब काम करता है।
user3942446

2
मैं इसके लिए भी कुछ समय बिताता हूं। धन्यवाद @TrueDub क्योंकि संदर्भ पुराना है। मैं अभी इसे अपडेट करता हूं। github.com/jayway/powermock/wiki/MockConstructor यह कहता है: परीक्षण मामले के वर्ग-स्तर पर @PrepareForTest (ClassThatCreatesTheNewInstance.class) एनोटेशन का उपयोग करें।
विक्टर चॉय

4
मैं एक ही समस्या है, लेकिन यह समाधान मेरे लिए काम नहीं कर रहा है
dexter

3
यदि आप कोड कवरेज के लिए eclemma का उपयोग कर रहे हैं तो यह समाधान काम नहीं करेगा। @PrepareForTest पर परीक्षण के तहत कक्षा को जोड़ने से उस वर्ग के लिए 0% कवरेज हो जाएगा
ACV

2
समाधान काम करेगा - परीक्षण सही ढंग से निष्पादित करता है। स्पष्ट रूप से eclemma PowerMockito से निपटने के लिए सुसज्जित नहीं है। कोड कवरेज इस सवाल का हिस्सा नहीं है।
TrueDub

3

जैसा कि @TrueDub ने अपने स्वीकृत उत्तर में उल्लेख किया है, आपको उस वर्ग को जोड़ने की आवश्यकता है जहां कंस्ट्रक्टर को बुलाया जाता है @PrepareForTest

हालाँकि, यदि आप ऐसा करते हैं, तो उस वर्ग के लिए कवरेज, जैसा कि अंकलम्मा और सोनार द्वारा रिपोर्ट किया गया है, उस वर्ग के लिए शून्य होगा

पॉवर्मॉकिटो विकी

हम Javassist को ByteBuddy (# 727) से बदलने जा रहे हैं और इस पुराने मुद्दे को हल करने में मदद करनी चाहिए। लेकिन अभी अभी JaCoCo ऑन-द-फ्लाई इंस्ट्रूमेंटेशन के साथ NO WAY TO USE पॉवरमॉक है। और आईडीई में कोड कवरेज प्राप्त करने के लिए कोई समाधान नहीं।

तो यहां समाधान एक स्थिर कारखाने का उपयोग करने के लिए वास्तविक कोड को फिर से तैयार करना होगा जो उस वर्ग का एक उदाहरण लौटाएगा और फिर इसे सांख्यिकीय रूप से नकली करेगा।


अपनी टिप्पणी से सहमत हैं।
रात्रि

यह हालांकि Intellij में कोई समस्या नहीं है।
एसीवी

0

शायद आप बस उपयोग कर सकते हैं

Mockito.doReturn(value).when(xxx)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.