如何在Java中的相同测试中使用多个端点来模拟REST服务器?
问题描述:
我试图测试一个Java方法,它向远程REST服务器发出请求以检索一些JSON数据,从该JSON中提取一个ID,然后使用该ID向另一个端点上的同一服务器发出另一个请求。如何在Java中的相同测试中使用多个端点来模拟REST服务器?
使用Mockito的MockRestServiceServer,我可以成功地模拟和测试期望对一个端点发出单一请求的服务器,但似乎无法使用它来创建具有一组预定义端点的服务器,并带有自己的期望和响应。
我如何模拟一个具有多个端点的服务器,用于测试向远程服务器发出多个不同请求的单个函数?
答
我的答案假定您使用的是SpringBoot,但这个想法可以一般地应用。
使您的类依赖于RestOperations接口,以便您可以在测试时传递存根。
类被测
public class Foo {
private final RestOperations restOperations;
public Foo(RestOperations restOperations) {
this.restOperations = restOperations;
}
}
测试
public void test() {
Foo foo = new Foo(new MyStub());
}
依靠抽象,不具体实现。
答
所以我实际上能够解决我的问题。关键是要手动创建自己的MockRestServiceServerBuilder建立你MockRestServiceServer而不是使用createServer(RestTemplate)或bindTo(RestTemplate).build()方法,像这样:
MockRestServiceServer.MockRestServiceServerBuilder builder =
MockRestServiceServer.bindTo(restTemplate);
builder.ignoreExpectOrder(true);
MockRestServiceServer server = builder.build();
通过这样做,根本RequestExpectationManager场在MockRestServiceServer中被初始化为一个UnorderedRequestExpectationManager,允许你匹配请求,而不管它们的顺序。这为我解决了很多麻烦。
尽管我相信你已经连贯地写下了你的问题,但我很难理解为什么你不能只提出多个请求。向第一个端点发送请求,解析JSON响应,然后使用先前解析的JSON向其中一个不同端点提交新请求,并根据需要重复多次。 Mockito的MockRestServiceServer在其服务器的API中可能有一些代码,可以让你这样做,所以也许可以深入其文档。 –
我想在一个web脚本中测试一个函数,这个脚本会进行两个API调用。据我所知,我不能在MockRestServiceServer上先发制人地定义两个端点,然后运行该方法,以便在调用该函数时在模拟服务器中存在两个端点。 – AdvilPill
@AdvillPill好吧,一个好的短期修复可能是运行两个MockRestServiceServers,每个MockRestServiceServers都有自己的端点。 –