2015-05-13 15 views
6

Test etmek istediğim bir sınıfa sahibim. Bu şuna benzer:Özel alıcılarla nasıl dalga geçilir?

public class ClassUnderTest 
{ 
    private Dependency1 dep1; 

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

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

Sınıf Dependency1 karmaşıktır ve ben methodUnderTest() için bir birim test yazarken bunu taklit etmek istiyorum.

Bunu nasıl yaparım?

+0

açık tutmak için yeterince farklı, IMO – NickJ

+0

@NickJ: Ben bu kadar ikna değilim. Tavsiye genellikle aynı olacaktır: bunu yapmayın, bu bağımlılıkları enjekte etmek için farklı bir yaklaşım kullanın, vb. – Makoto

cevap

2

Çok var kolay, ve özel bir yöntemle alay etmeye veya sınama altında sınıfı değiştirmeye gerek yok:

@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

Bence mimarinizin ihtiyacı var.

böyle bir şey yapamaz Neden

...
public class MyClass { 

    private Dependency dependency; 

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

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

Ardından üretimde bunu yapabilirsiniz:
myClass.setDependency(realDependency); 

Ve testinde

, yapabilirsin:

myClass.setDependency(mockDependency); 
+0

'Bağımlılık yaratmak için çok pahalı olabilir ve asla kullanılmayabilir. Yani tembel yaratımı kaybetmek arzu edilmeyebilir. –

+0

Bu durumda, DependencyFactory yerine geçmek kolay – NickJ