Dưới đây là một thiết lập đơn giản của ứng dụng của tôi. Nó có một lớp Foobar mà các cuộc gọi trên một phương pháp mặt tiền để lấy dữ liệu. Mặt tiền sau đó gọi trên một dịch vụ web để thực sự có được dữ liệu và sau đó thao tác dữ liệu một chút và sau đó trả về nó cho Foobar.Kiểm tra cuộc gọi phương thức không đồng bộ
Bây giờ do dịch vụ web có thể mất nhiều thời gian để chạy, nên gọi phương thức tới mặt tiền không đồng bộ. Do đó phương thức của mặt tiền không có giá trị trả về, mà thay vào đó, phương thức này sử dụng một đối tượng gọi lại. Hãy xem ví dụ và tiếp tục đọc bên dưới.
public class Foobar {
private List<DTO> dtos;
@Autowired
private Facade facade;
public void refresh() {
facade.refreshFoobar(new CallBack() {
public void dataFetched(List<DTO> dtos) {
setDtos(dtos);
}
});
}
public void setDtos(List<DTO> dtos) {
this.dtos = dtos;
}
}
public class Facade {
...
public void refreshFoorbar(CallBack cb) {
// Fetch data from a web service
List<DTO> dtos = webService.getData();
// Manipulate DTOs
....
// call on the callback method
cb.dataFecthed(dtos);
}
}
Tôi có hai cách làm cho phương thức mặt tiền không đồng bộ, bằng cách tạo chuỗi theo cách thủ công hoặc bằng cách sử dụng chú thích lò xo @Async.
public class Facade {
public void refreshFoorbar(CallBack cb) {
new Thread() {
@Override
public void run() {
....
}
}.start();
}
}
// ... OR ...
public class Facade {
@Async
public void refreshFoorbar(CallBack cb) {
....
}
}
Vấn đề của tôi là bây giờ tôi cần viết bài kiểm tra tích hợp cho chuỗi cuộc gọi phương thức này. Tôi nghĩ rằng tôi cần phải buộc các cuộc gọi mặt tiền không đồng bộ được đồng bộ khi thử nghiệm tích hợp được chạy, nếu không tôi sẽ không biết chắc chắn khi tôi có thể làm các xác nhận thích hợp. Ý tưởng duy nhất để thực hiện phương thức gọi đồng bộ là sử dụng các luồng xử lý thủ công và làm cho luồng có điều kiện (vì vậy, cho mục đích thử nghiệm, tôi có một mệnh đề if xác định xem phương thức mặt tiền có nên chạy trong một luồng riêng biệt hay không).
Tuy nhiên, tôi có một cảm giác rằng có thể có một giải pháp tốt hơn cho vấn đề của tôi, cho dù đó là một cách tốt hơn buộc các phương pháp để tôi đồng bộ, ví dụ như với mùa xuân, hoặc bằng cách kiểm tra đa luồng trên một cách nào đó.
Đây là nơi tôi cần đề xuất của bạn, bạn giải quyết vấn đề của mình như thế nào? Lưu ý, tôi đang sử dụng junit cho cả bài kiểm tra đơn vị và tích hợp.
Tôi không biết đó có phải là cách chính xác hay không. Thông thường việc kiểm tra các điều kiện không đồng bộ chỉ là khởi chạy tác vụ không đồng bộ, đợi một lúc và kiểm tra xem tác vụ đã được hoàn thành hay chưa. – SJuan76