2011-10-04 11 views
7

में एक निर्माता कॉल मैं एक इस बोर्ड पर इसी तरह के सवाल को देखा है बाहर नकली है, लेकिन उनमें से कोई भी मेरे सवाल का जवाब। यह अजीब लगता है, लेकिन क्या आप उस मकसद पर एक कन्स्ट्रक्टर कॉल को मॉक करना संभव है।EasyMock: जावा

उदाहरण:

class RealGuy { 

    .... 
    public void someMethod(Customer customer) { 
    Customer customer = new Customer(145); 
    } 
} 
class MyUnitTest() { 
    public Customer customerMock = createMock(Customer.class) 
    public void test1() { 
    //i can inject the mock object, but it's still calling the constuctor 
    realGuyobj.someMethod(customerMock); 
    //the constructor call for constructor makes database connections, and such. 
    } 
} 

मैं एक निर्माता कॉल की उम्मीद कैसे कर सकते हैं? मैं नए इंस्टेंस का उपयोग करने के लिए ग्राहक कन्स्ट्रक्टर कॉल बदल सकता हूं, लेकिन मुझे यकीन नहीं है कि इससे मदद मिलेगी। new Customer(145) कन्स्ट्रक्टर का शरीर क्या करता है इस पर मेरा कोई नियंत्रण नहीं है।

क्या यह संभव है?

+0

एक कन्स्ट्रक्टर में डेटाबेस कनेक्शन नहीं बनाना एक अच्छा विचार होगा। कक्षा का उपयोग कर कक्षा में कनेक्शन इंजेक्ट करें। –

+0

सहमत हुए। लेकिन मैं उस ग्राहक कन्स्ट्रक्टर तर्क पर नियंत्रण नहीं रखता हूं। – Setzer

उत्तर

11

आप easymock साथ ऐसा नहीं कर सकते, क्योंकि यह मजाक कंस्ट्रक्टर्स समर्थन नहीं करता। powermock नामक एक लाइब्रेरी है जो यह कर सकती है और एकमात्र मॉकिंग लाइब्रेरी है, जहां तक ​​मुझे पता है, जो जावा में रचनाकारों और स्थिर तरीकों को रोक सकता है।

1
import static org.powermock.api.easymock.PowerMock.expectNew; 

instance = new UsesNewToInstantiateClass(); 
expectNew(AnyOldClass.class).andReturn(anyClass); 
15

आप EasyMock 3.0 और उसके बाद ऐसा कर सकते हैं।

Customer cust = createMockBuilder(Customer.class) 
    .withConstructor(int.class) 
    .withArgs(145) 
    .addMockedMethod("someMethod") 
    .createMock(); 
संबंधित मुद्दे