วิธีมาตรฐาน:
@RestController
public class Main {
UserService userService;
public Main(){
userService = new UserServiceImpl();
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
ส่วนต่อประสานบริการผู้ใช้:
public interface UserService {
String print(String text);
}
คลาส UserServiceImpl:
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
เอาท์พุท: Example test UserServiceImpl
นั่นเป็นตัวอย่างที่ดีของคลาสที่มีการเชื่อมต่อที่แน่นหนาตัวอย่างการออกแบบที่ไม่ดีและจะมีปัญหากับการทดสอบ (PowerMockito ก็ไม่ดีเช่นกัน)
ตอนนี้เรามาดูการฉีดพึ่งพา SpringBoot ตัวอย่างที่ดีของการมีเพศสัมพันธ์แบบหลวม:
อินเตอร์เฟสยังคงเหมือนเดิม
ชั้นหลัก:
@RestController
public class Main {
UserService userService;
@Autowired
public Main(UserService userService){
this.userService = userService;
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
ServiceUserImpl คลาส:
@Component
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
เอาท์พุท: Example test UserServiceImpl
และตอนนี้มันง่ายที่จะเขียนทดสอบ:
@RunWith(MockitoJUnitRunner.class)
public class MainTest {
@Mock
UserService userService;
@Test
public void indexTest() {
when(userService.print("Example test")).thenReturn("Example test UserServiceImpl");
String result = new Main(userService).index();
assertEquals(result, "Example test UserServiceImpl");
}
}
ฉันแสดง@Autowired
คำอธิบายประกอบบน constructor แต่สามารถใช้กับ setter หรือ field ได้