Если вы не хотите использовать 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, что, возможно, является тем, что вам нужно.
Конечно, недостатком является то, что вы позволяете вызывающей стороне устанавливать объект Bar.
Надеюсь, поможет.