下面是我的應用程序的簡化設置。它有一個Foobar類,它調用一個外觀方法來獲取數據。然後,外觀調用Web服務來實際獲取數據,然後稍微處理數據,然後將其返回給Foobar。測試一個異步方法調用
現在因爲Web服務可能持續較長一段時間的運行,該方法調用的門面需要是異步的。因此,Facade的方法沒有返回值,而是使用回調對象。看看這個例子,並繼續閱讀下面。
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);
}
}
我有兩種使Facade的方法異步的方法,無論是通過手動創建線程還是使用springs @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) {
....
}
}
我的問題是,我現在需要爲這個方法調用鏈寫一個集成測試。我認爲我需要強制異步門面調用在集成測試運行時同步,否則當我可以執行適當的斷言時我無法確定。用於製備方法調用同步的唯一想法是使用手工處理線程和使穿線條件(因此,用於測試目的,我有一個if語句,它確定是否門面方法應在一個單獨的線程來運行或沒有)。
但是,我有一種感覺,可能有更好的解決方案來解決我的問題,無論是強制方法對我來說是同步的更好方式,例如使用spring,還是通過在某種方式上測試多線程。
這是我需要你的建議,你將如何解決我的問題?請注意,我正在使用junit進行單元測試和集成測試。
我不知道這是否是正確的方法。通常,對異步條件進行測試只是啓動異步任務,等待一段時間並測試任務是否已完成。 – SJuan76