Якщо ви не хочете використовувати 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);
}
}
Як ви бачите, коли викликуєте метод таким чином, вам не потрібно імпортувати клас Bar у будь-який інший клас, який викликає ваш метод foo, що, можливо, щось ви хочете.
Звичайно, недоліком є те, що ви дозволяєте абоненту встановити смугу "Об'єкт".
Сподіваюся, це допомагає.