2015-05-13 14 views
6

Ich habe eine Klasse, die ich testen möchte. Es sieht wie folgt aus:Wie man private Getters vortäuscht?

public class ClassUnderTest 
{ 
    private Dependency1 dep1; 

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

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

Klasse abhaengigkeit1 ist komplex, und ich möchte es spotten, wenn Sie einen Komponententest für methodUnderTest() zu schreiben.

Wie mache ich das?

+0

es ist ausreichend anders zu offen zu halten, IMO – NickJ

+0

@NickJ: Ich bin nicht so überzeugt es ist. Der Rat wird im Allgemeinen der gleiche sein: tun Sie es nicht, verwenden Sie einen anderen Ansatz, um diese Abhängigkeiten zu injizieren, etc. – Makoto

Antwort

2

Es ist sehr einfach, und es besteht keine Notwendigkeit, eine private Methode zu verspotten oder die zu testende Klasse zu ändern:

@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

Ich denke, Ihre Architektur muss betrachtet werden.

Warum so etwas nicht tun ...

public class MyClass { 

    private Dependency dependency; 

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

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

dann in der Produktion könnten Sie tun:

myClass.setDependency(realDependency); 

Und in Test, könnten Sie:

myClass.setDependency(mockDependency); 
+0

'Dependency' ist möglicherweise sehr teuer in der Erstellung und darf niemals verwendet werden. Also ist es vielleicht nicht wünschenswert, die faule Schöpfung zu verlieren. –

+0

In diesem Fall ist es einfach, DependencyFactory zu übergeben – NickJ

Verwandte Themen