以下是我应用程序的简化设置。它有一个名为Foobar的类,调用一个门面方法来获取数据。然后,门面调用Web服务实际获取数据,稍微处理一下,然后将其返回给Foobar。
由于Web服务可能需要一段时间才能运行,因此对门面的方法调用需要是异步的。因此,门面方法没有返回值,而是使用回调对象。请查看下面的示例并继续阅读。
我的问题是,我现在需要为这个方法链编写一个集成测试。我认为在运行集成测试时,需要将异步门面调用强制变成同步,否则我就不知道何时可以进行适当的断言。唯一想出的使方法调用变为同步的方法是使用手动处理的线程,并且将线程条件化(因此,为了测试目的,我有一个if子句,确定门面方法是否应在单独的线程中运行)。
然而,我有一种感觉,可能有更好的解决方案,无论是通过更好的方式强制方法变为同步,例如Spring,还是通过某种方式测试多线程。
这就是我需要您的建议的地方,您会如何解决我的问题?请注意,我对单元测试和集成测试都使用Junit。
由于Web服务可能需要一段时间才能运行,因此对门面的方法调用需要是异步的。因此,门面方法没有返回值,而是使用回调对象。请查看下面的示例并继续阅读。
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);
}
}
我有两种方法使外观的方法异步化,一种是手动创建线程,另一种是使用Spring的@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。