Nếu bạn không muốn sử dụng DI hoặc Factories. Bạn có thể cấu trúc lại lớp của mình theo một cách khó khăn:
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
}
}
Và lớp kiểm tra của bạn:
@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();
}
}
Sau đó, lớp đang gọi phương thức foo của bạn sẽ làm như thế này:
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
Như bạn có thể thấy khi gọi phương thức theo cách này, bạn không cần nhập lớp Bar trong bất kỳ lớp nào khác đang gọi phương thức foo của bạn, đây có thể là thứ bạn muốn.
Tất nhiên nhược điểm là bạn đang cho phép người gọi đặt Đối tượng Bar.
Hy vọng nó giúp.