Wenn Sie keine DI oder Fabriken verwenden möchten. Sie können Ihre Klasse auf etwas trickreiche Weise umstrukturieren:
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
}
}
Und Ihre Testklasse:
@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();
}
}
Dann wird die Klasse, die Ihre foo-Methode aufruft, dies so tun:
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
Wie Sie sehen können, wenn Sie die Methode auf diese Weise aufrufen, müssen Sie die Bar-Klasse in keiner anderen Klasse importieren, die Ihre foo-Methode aufruft, was vielleicht etwas ist, das Sie wollen.
Der Nachteil ist natürlich, dass Sie dem Aufrufer erlauben, das Bar Object zu setzen.
Ich hoffe, es hilft.