DI 또는 공장을 사용하지 않으려는 경우. 약간 까다로운 방식으로 수업을 리팩토링 할 수 있습니다.
public class Foo {
private Bar bar;
public void foo(Bar bar){
this.bar = (bar != null) ? bar : new Bar();
bar.someMethod();
this.bar = null; // for simulating local scope
}
}
그리고 당신의 시험 수업 :
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock Bar barMock;
Foo foo;
@Test
public void testFoo() {
foo = new Foo();
foo.foo(barMock);
verify(barMock, times(1)).someMethod();
}
}
그런 다음 foo 메소드를 호출하는 클래스는 다음과 같이합니다.
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
이 방법으로 메소드를 호출 할 때 알 수 있듯이 foo 메소드를 호출하는 다른 클래스에서 Bar 클래스를 가져올 필요가 없습니다.
물론 단점은 호출자가 막대 객체를 설정할 수 있다는 것입니다.
도움이 되길 바랍니다.