Cách tiêu chuẩn:
@RestController
public class Main {
UserService userService;
public Main(){
userService = new UserServiceImpl();
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
Giao diện dịch vụ người dùng:
public interface UserService {
String print(String text);
}
Lớp UserServiceImpl:
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Đầu ra: Example test UserServiceImpl
Đó là một ví dụ tuyệt vời về các lớp kết hợp chặt chẽ, ví dụ thiết kế xấu và sẽ có vấn đề với việc thử nghiệm (PowerMockito cũng rất tệ).
Bây giờ chúng ta hãy xem xét tiêm phụ thuộc SpringBoot, ví dụ hay về khớp nối lỏng lẻo:
Giao diện vẫn giữ nguyên,
Lớp chính:
@RestController
public class Main {
UserService userService;
@Autowired
public Main(UserService userService){
this.userService = userService;
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
Lớp ServiceUserImpl:
@Component
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Đầu ra: Example test UserServiceImpl
và bây giờ thật dễ dàng để viết bài kiểm tra:
@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");
}
}
Tôi đã hiển thị @Autowired
chú thích trên hàm tạo nhưng nó cũng có thể được sử dụng trên setter hoặc trường.