2015-05-13 13 views
6

मेरे पास एक कक्षा है जिसे मैं परीक्षण करना चाहता हूं। यह इस के समान दिखता है:निजी गेटर्स का नकल कैसे करें?

public class ClassUnderTest 
{ 
    private Dependency1 dep1; 

    private Dependency1 getDependency1() 
    { 
     if (dep1 == null) 
      dep1 = new Dependency1(); 
     return dep1; 
    } 

    public void methodUnderTest() 
    { 
     .... do something 
     getDependency1().InvokeSomething(..); 
    } 
} 

कक्षा Dependency1 जटिल है और मैं जब methodUnderTest() के लिए एक इकाई परीक्षण लिखने के लिए इसे बाहर नकली करना चाहते हैं।

मैं यह कैसे कर सकता हूं?

+0

यह खुले रखने के लिए पर्याप्त रूप से अलग है, आईएमओ – NickJ

+0

@NickJ: मुझे विश्वास नहीं है कि यह है। सलाह आम तौर पर समान होगी: ऐसा न करें, उन निर्भरताओं को इंजेक्ट करने के लिए एक अलग दृष्टिकोण का उपयोग करें, आदि – Makoto

उत्तर

2

यह बहुत है आसान है, और किसी निजी विधि का नकल करने या परीक्षण के तहत कक्षा को बदलने की कोई आवश्यकता नहीं है:

@Test 
public void exampleTest(@Mocked final Dependency dep) { 
    // Record results for methods called on mocked dependencies, if needed: 
    new Expectations() {{ dep.doSomething(); result = 123; }} 

    new ClassUnderTest().methodUnderTest(); 

    // Verify another method was called, if desired: 
    new Verifications() {{ dep.doSomethingElse(); }} 
} 
2

मुझे लगता है कि आपके आर्किटेक्चर को देखने की आवश्यकता है।

क्यों कुछ इस तरह से काम नहीं ...

public class MyClass { 

    private Dependency dependency; 

    public void setDependency(Dependency dep) { 
    this.dependency = dep; 
    } 

    public void myMethod() { 
    Result result = dependency.callSomeMethod(); 
    //do stuff 
    } 
} 

तो उत्पादन में तुम कर सकते हो:

myClass.setDependency(realDependency); 

और परीक्षण में आप:

myClass.setDependency(mockDependency); 
+0

'निर्भरता' बनाने के लिए बहुत महंगा हो सकता है, और इसका कभी भी उपयोग नहीं किया जा सकता है। तो आलसी सृजन खोना वांछनीय नहीं हो सकता है। –

+0

उस स्थिति में, इसके बजाय निर्भरता फैक्ट्री में पास करना आसान है – NickJ

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