2012-06-05 5 views
20

में एक ही विधि का नकल कैसे करें जावा क्लास की एक विधि को मॉक करना संभव है?जावा

उदाहरण के लिए:

class A { 
    long method1(); 
    String method2(); 
    int method3(); 
} 


// in some other class 
class B { 
    void someMethod(A a) { 
     // how would I mock A.method1(...) such that a.method1() returns a value of my 
     // choosing; 
     // whilst leaving a.method2() and a.method3() untouched. 
    } 
} 

उत्तर

45

उपयोग Mockito's जासूसी तंत्र:

A a = new A(); 
A aSpy = Mockito.spy(a); 
Mockito.when(aSpy.method1()).thenReturn(5l); 

एक जासूस के उपयोग किसी भी विधि का टोंटदार नहीं है के लिए लिपटे वस्तु के डिफ़ॉल्ट व्यवहार को कहता है। इस तरह

public void testCase(@Mocked("methodToBeMocked") final ClassBoBeMocked mockedInstance) { 
      new Expectations() {{ 
        mockedInstance.methodToBeMocked(someParameter); returns(whateverYouLikeItToReturn); 
      }} 

    mockedInstance.callSomemethod(); 
} 
+16

या, दस्तावेज के रूप में, [कुछ मामलों में] (http://mockito.googlecode.com/svn/branches/1.7/javadoc/org/mockito/Mockito.html#doReturn (java.lang.Object)) आप 'डी की जरूरत है' Mockito.doReturn (51)। जब (aSpy)। method1(); '। – Arjan

+0

बस इतना। चीयर्स –

+0

दुर्भाग्यवश, आप इस तरह से अंतिम श्रेणी के उदाहरण पर जासूसी नहीं कर सकते हैं। :( –

1

आप यह मानते हुए JMockit का उपयोग कर रहे

import static org.mockito.Mockito.*; 

... 

A a = spy(new A()); 
when(a.method1()).thenReturn(10L); 
-2

आप बस A का एक उपवर्ग बना सकते हैं जो method1() ओवरराइड करता है।

+0

यह काम नहीं करेगा - क्योंकि आपको ए के उप-वर्ग में ए के मौजूदा उदाहरण में पास करना होगा subclass को विधि 2() और method3() क्रमशः कॉल 2() और method3() पर कॉल के लिए a.method2() और a.method3() को वापस करने के लिए। जिसका अर्थ है कि उपclass विधि 2() और method3() को ओवरराइड करेगा। – auser

+0

@ user63904: आह, तो आप चाहते हैं विधि 1 के व्यवहार को संशोधित करने के लिए कुछ विधि() के अंदर अभी भी ए के उदाहरण के साथ काम करते हुए पैरामीटर के रूप में पारित किया गया है? ठीक है, यह तब काम नहीं करेगा। –