Это проблема проектирования, так как испытуемый не честен относительно того, что ему действительно нужно для выполнения своей заданной функции. Он тесно связывает себя через new MyObject2(...)
таким образом, что затрудняет (не делает невозможным) тестирование в изоляции.
Тот факт, что MyObject2
зависит от MyObject
, является деталью реализации, которая MyClass
не нужно знать.
Следуя явному принципу зависимости,
Методы и классы должны явно требовать (обычно через параметры метода или параметры конструктора) любых взаимодействующих объектов, в которых они нуждаются для функционированияправильно.
MyClass
должен быть соответственно изменен рефакторинг
public class MyClass{
private MyObject svc;
private MyObject2 svc2;
public MyClass(MyObject svc, MyObject2 svc2){
this.svc = svc;
this.svc2 = svc2;
//this.svc2 = new MyObject2(svc); // <-- remove implementation details
}
public void getSvc(){
Result response = this.svc.getResponse();
if(!response.isEmpty())
this.svc2.filterResponse(response);
else
System.out.println("empty");
}
}
Разрешение на то, чтобы необходимые тесты / заглушки были явно введены в испытуемый объект при тестировании в изоляции.
//Arrange
MyObject svc = mock(MyObject.class);
MyObject2 svc2 = mock(MyObject2.class);
MyClass subject = new MyClass(svc, svc2);
Result response = mock(Result.class);
when(response.isEmpty()).thenReturn(false);
when(svc.getResponse()).thenReturn(response);
//Act
subject.getSvc();
//Assert
verify(svc2, times(1)).filterResponse(response); //verify method call inside void method
И тот факт, что тестируемый метод является void
, не является следствием проверяемого поведения.