如果您不想使用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);
}
}
正如您在以这种方式调用方法时所看到的,您不需要在正在调用foo方法的任何其他类中导入Bar类,这也许是您想要的。
当然,缺点是您允许调用者设置Bar对象。
希望能帮助到你。