如何在Java中的相同测试中使用多个端点来模拟REST服务器?

如何在Java中的相同测试中使用多个端点来模拟REST服务器?

问题描述:

我试图测试一个Java方法,它向远程REST服务器发出请求以检索一些JSON数据,从该JSON中提取一个ID,然后使用该ID向另一个端点上的同一服务器发出另一个请求。如何在Java中的相同测试中使用多个端点来模拟REST服务器?

使用Mockito的MockRestServiceServer,我可以成功地模拟和测试期望对一个端点发出单一请求的服务器,但似乎无法使用它来创建具有一组预定义端点的服务器,并带有自己的期望和响应。

我如何模拟一个具有多个端点的服务器,用于测试向远程服务器发出多个不同请求的单个函数?

+0

尽管我相信你已经连贯地写下了你的问题,但我很难理解为什么你不能只提出多个请求。向第一个端点发送请求,解析JSON响应,然后使用先前解析的JSON向其中一个不同端点提交新请求,并根据需要重复多次。 Mockito的MockRestServiceServer在其服务器的API中可能有一些代码,可以让你这样做,所以也许可以深入其文档。 –

+1

我想在一个web脚本中测试一个函数,这个脚本会进行两个API调用。据我所知,我不能在MockRestServiceServer上先发制人地定义两个端点,然后运行该方法,以便在调用该函数时在模拟服务器中存在两个端点。 – AdvilPill

+0

@AdvillPill好吧,一个好的短期修复可能是运行两个MockRestServiceServers,每个MockRestServiceServers都有自己的端点。 –

我的答案假定您使用的是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,允许你匹配请求,而不管它们的顺序。这为我解决了很多麻烦。