หากคุณไม่ต้องการใช้ 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 Object
หวังว่ามันจะช่วย