2016-03-23 10 views
25

मैं एक फील्ड वैरिएबल का नकल कैसे कर सकता हूं जिसे इनलाइन शुरू किया जा रहा है?मॉकिटो: मॉक निजी क्षेत्र की शुरुआत

उदा।

class Test { 
    private Person person = new Person(); 
    ... 
    public void testMethod() { 
     person.someMethod(); 
     ... 
    } 
} 

यहाँ मैं person.someMethod नकली करना चाहते हैं() जबकि परीक्षण विधि - टेस्ट # testMethod।

जिसके लिए मुझे व्यक्ति चर के प्रारंभिक रूप से नकल करने की आवश्यकता है। कोई सुराग?

संपादित करें: मुझे व्यक्ति वर्ग को संशोधित करने की अनुमति नहीं है।

+0

यह लिंक आपको http://stackoverflow.com/questions/13645571/how-to-mock-a-private-dao-variable लिए उपयोगी हो सकता है – Popeye

+2

आप refactor चाहिए अपने कोड ताकि आप 'व्यक्ति' के लिए एक नकली में गुजर सकें। विकल्पों में ऐसा करने के लिए एक कन्स्ट्रक्टर जोड़ना, या एक सेटर विधि जोड़ना शामिल है। –

उत्तर

9

मुझे पहले से ही इस समस्या का समाधान मिला है जिसे मैं यहां पोस्ट करना भूल गया था। इस समाधान के लिए

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Test.class }) 
public class SampleTest { 

@Mock 
Person person; 

@Test 
public void testPrintName() throws Exception { 
    PowerMockito.mockStatic(Person.class); 
    PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person); 
    Test test= new Test(); 
    test.testMethod(); 
    } 
} 

प्रमुख बिंदु इस प्रकार हैं:

  1. PowerMockRunner के साथ अपने परीक्षण मामलों चल रहा है: @PrepareForTest({ Test.class })

  2. : @RunWith(PowerMockRunner.class)

  3. आज्ञा Powermock निजी क्षेत्रों के हेरफेर के लिए Test.class तैयार करने के लिए

    और अंत में व्यक्ति वर्ग के लिए निर्माता का मज़ाक उड़ाएं:

    PowerMockito.mockStatic(Person.class); PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);

0

कई मायनों हो सकता है, उनमें से एक

Class Test { 
    private Person person = new Person(); 
    ... 
    public void testMethod() { 
    person.someMethod(); 
    ... 
    } 
} 

यह

Class Test { 
    private Person person; 
    public Test() { 
     if(person == null) { 
     person = new Person(); 
     } 
    } 
    ... 
    public void testMethod() { 
    person.someMethod(); 
    ... 
    } 

} 

अपने परीक्षण का परीक्षण करने के लिए के रूप में संशोधित करने की आवश्यकता,

@Runwith(SpringJunit4Runner.class) 
public class TestingTest { 

@InjectMocks 
Test test; 

@Mock 
private Person person; 

@Before 
public void setUp() { 

when(person.XXX).thenReturn(""); 

} 

@Test 
public void testMethod() { 

........... 
} 
} 
+0

मुझे यकीन नहीं है कि यह इस तरह से काम करने जा रहा है, हम जिस तरह से आप कर रहे हैं, हम कन्स्ट्रक्टर को नकल नहीं कर सकते। Powermock का उपयोग कर, हम यह कर सकते हैं। लेकिन इसके अलावा मुझे इस व्यक्ति वर्ग को संशोधित करने की अनुमति नहीं है। :( – Arun

37

Mockito के साथ आता है हो सकता है आपको कुछ प्रतिबिंब बॉयलर प्लेट कोड बचाने के लिए एक सहायक वर्ग:

import org.mockito.internal.util.reflection.Whitebox; 

//... 

@Mock 
private Person mockedPerson; 
private Test underTest; 

// ... 

@Test 
public void testMethod() { 
    Whitebox.setInternalState(underTest, "person", mockedPerson); 
    // ... 
} 

अद्यतन: दुर्भाग्य mockito टीम remove the class को Mockito 2 में फैसला किया तो तुम वापस अपने स्वयं के प्रतिबिंब बॉयलरप्लेट कोड लिखने, एक और पुस्तकालय का उपयोग करने के हैं (उदा Apache Commons Lang), या बस Whitebox कक्षा (यह MIT licensed है) को सुरक्षित करें।

+0

मैं अन्य कारणों से अपनी लक्षित वस्तु जासूसी कर रहा हूं और इस मामले में जब मेरा ऑब्जेक्ट जासूसी कर रहा है, तो मैं इस तरह आंतरिक स्थिति सेट नहीं कर सकता। – Arun

+0

क्यों नहीं? मैं इसे जासूसों के साथ उपयोग कर रहा हूं। एक व्यक्ति उदाहरण बनाएं।जो कुछ भी स्टबिंग की जरूरत है उसे दबाएं, फिर इसे अपने टेस्ट इंस्टेंस पर सेट करें। – Ralf

+0

चेतावनी: व्हाइटबॉक्स 'आंतरिक' पैकेज में है और अब Mockito 2.6.2 पर काम नहीं कर रहा है। – Nova

संबंधित मुद्दे