Se você não quiser usar DI ou Fábricas. Você pode refatorar sua classe de uma maneira um pouco complicada:
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
}
}
E sua classe de teste:
@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();
}
}
Em seguida, a classe que está chamando seu método foo fará o seguinte:
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
Como você pode ver ao chamar o método dessa maneira, não é necessário importar a classe Bar em nenhuma outra classe que esteja chamando seu método foo, que talvez seja algo que você deseja.
Obviamente, a desvantagem é que você está permitindo que o chamador defina o Objeto de barra.
Espero que ajude.