Как издеваться над частными добытчиками?

У меня есть класс, который я хочу проверить. Это выглядит примерно так:

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(),

Как я могу это сделать?

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(); }}
}

Я думаю, что ваша архитектура нуждается в рассмотрении.

Почему бы не сделать что-то подобное...

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);
Другие вопросы по тегам