2012-01-25 16 views
8

मैं कुछ प्रतिबिंब आधारित तरीकों का नकल करने की कोशिश कर रहा हूं। नीचे आप विवरण,मॉकिंग प्रतिबिंब आधारित कॉल

क्लास टेस्ट के तहत

public class TracerLog { 
    @AroundInvoke 
    public Object logCall(InvocationContext context) throws Exception { 
     Logger logger = new Logger(); 
     String message = "INFO: Invoking method - " 
       + context.getMethod().getName() + "() of Class - " 
       + context.getMethod().getDeclaringClass(); 

     logger.write(message); 
     return context.proceed(); 
    } 
} 

टेस्ट

public class TracerLogTest { 

@Mock 
InvocationContext mockContext; 
@Mock 
Logger mockLogger; 
@InjectMocks 
private TracerLog cut = new TracerLog(); 

@BeforeMethod 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void logCallTest() throws Exception { 
    when(mockContext.proceed()).thenReturn(true); 
    when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass"); 
    cut.logCall(mockContext); 
    verify(mockContext).proceed(); 
} 

}

या

@Test 
public void logCallTest() throws Exception { 
    when(mockContext.proceed()).thenReturn(true); 
    when(mockContext.getMethod().getName()).thenReturn("someMethod"); 
    when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass"); 
    cut.logCall(mockContext); 
    verify(mockLogger).write(anyString()); 
    verify(mockContext).proceed(); 
} 

लेकिन, परीक्षण एक NullPointerException के साथ विफल देख सकते हैं । मैं समझता हूं कि मैं अवधारणाओं को मजाक करने के खिलाफ कुछ गलत कर रहा हूं, लेकिन मुझे समझ में नहीं आता कि यह क्या है। क्या आप इस पर कुछ प्रकाश डाल सकते हैं और यह भी सुझाव दे सकते हैं कि इस विधि का परीक्षण कैसे किया जा सकता है?

धन्यवाद।

+0

आप अपनी नकली वस्तुओं और अपनी वस्तु को परीक्षण के तहत कैसे बना रहे हैं? क्या आप केवल टेस्ट विधि के बजाय अपनी पूरी टेस्ट क्लास पोस्ट कर सकते हैं? धन्यवाद। –

+0

@ डेविडवैलस मैंने अब पूरा कोड शामिल करने के लिए प्रश्न संपादित किया है। – Bala

उत्तर

17

आपको एक विधि वस्तु और कक्षा वस्तु की आवश्यकता है। आपकी टिप्पणी के अनुसार, मॉकिटो एक विधि का नकल नहीं कर सकता है, इसलिए आपको एक वास्तविक आवश्यकता होगी। मैंने इसका परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि यह काम करेगा। बजाय:

when(mockContext.getMethod().getName()).thenReturn("someMethod"); 
when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass"); 

आप की जरूरत है:

// any method will do, but here is an example of how to get one. 
Method testMethod = this.getClass().getMethod("logCallTest"); 

when(mockContext.getMethod()).thenReturn(testMethod); 

जाहिर है, getName() वापस आ जाएगी नहीं "someMethod" अब और getDeclaringClass().getName() इस परीक्षण क्लास का नाम वापस आ जाएगी (उदाहरण में), लेकिन यद्यपि आप नहीं कर सके वे जो वापस लौटते हैं उन्हें चुनते हैं, वे जो भी लौटते हैं वह अभी भी निर्धारिती है, इसलिए आपको अपनी जरूरत की किसी भी चीज़ को सत्यापित करने में सक्षम होना चाहिए। (बेशक, अगर आपको विधि ऑब्जेक्ट पर कॉल करने या सत्यापित करने की आवश्यकता है, तो आप अभी भी अटक गए हैं।)

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मॉकिटो शिकायत करता है कि यह java.lang.reflect.Method नकल या जासूसी नहीं कर सकता है। क्या इसे हासिल करने के कोई अन्य तरीके हैं? – Bala

+0

मैंने एक वास्तविक विधि ऑब्जेक्ट का उपयोग करने के तरीके को दिखाने के लिए अपना उत्तर संपादित कर दिया है। यह आपके प्रश्न में सरल उदाहरणों को संबोधित करना चाहिए, लेकिन अभी भी सीमाएं हैं। – jhericks

+0

आपके सुझाव के लिए धन्यवाद, लेकिन mockContext.getMethod()। GetDeclaringClass() इस मामले में काम नहीं करेगा। – Bala

3

हाँ समस्या यह है कि mockContext.getMethod() शून्य वापस लौटने जा रहा है। तो हर बार जब आप इसे चलाते हैं, तो परिणाम (getDeclaringClass() या getName()) पर कुछ कॉल करें, आपको एनपीई मिल जाएगा। जब आप नकली सेट करते हैं, तो शायद आप RETURNS_DEEP_STUBS डिफ़ॉल्ट उत्तर का उपयोग करना चाहते हैं। कुछ

@Mock(answer = RETURNS_DEEP_STUBS) private InvocationContext mockContext; 

चाल चलाना चाहिए।

+0

हाय डेविड मैं ज्यादातर आपके साथ सहमत हूं। लेकिन पाठक के लिए: विधि एक अंतिम कक्षा है, इसे मॉकिटो के साथ मजाक नहीं किया जा सकता है;) इसके अलावा मैं उन मॉक प्रकारों की अनुशंसा नहीं करता जो आपके पास नहीं हैं। – Brice

+0

ओह परेशान। ब्राइस सही है (वह आमतौर पर इन चीजों के बारे में है)। चूंकि मॉकिटो अंतिम कक्षाओं का नकल नहीं कर सकता है, इसलिए मुझे मूल पोस्टर की इच्छा रखने का कोई तरीका नहीं दिख रहा है। माफ़ कीजिये। –

+0

@ ब्राइस वेल, मैं आपसे सहमत हूं, लेकिन InvocationContext अंतिम श्रेणी नहीं है और इसे मेरे मामले में मजाक कर दिया जाना चाहिए क्योंकि, मैं नहीं चाहता कि एप्लिकेशन सर्वर मेरे परीक्षण के लिए चल रहा हो। क्या मैं कहीं गलत हो गया? – Bala

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