Как издеваться над частными добытчиками?
У меня есть класс, который я хочу проверить. Это выглядит примерно так:
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);