首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MockRestServiceServer模拟REST调用

用MockRestServiceServer模拟REST调用
EN

Stack Overflow用户
提问于 2016-06-13 04:49:10
回答 3查看 34.2K关注 0票数 10

我正在编写一个JUnit测试用例,该测试用例测试助手类中的方法。该方法使用REST调用外部应用程序,在JUnit测试中我试图模拟这个调用。

helper方法使用Spring的RestTemplate进行REST调用。

在我的测试中,我创建了一个模拟REST服务器和一个模拟REST模板,并将它们实例化如下:

代码语言:javascript
复制
@Before
public void setUp() throws Exception {
    mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate());
}

然后启动模拟服务器,以便在助手方法进行REST调用时返回适当的响应:

代码语言:javascript
复制
// response is some XML in a String
mockServer
    .expect(MockRestRequestMatchers.requestTo(new URI(myURL)))
    .andExpect(MockRestRequestMatchers.method(HttpMethod.GET))
    .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
        .contentType(MediaType.APPLICATION_XML)
        .body(response));

当我运行我的测试时,helper方法从它发出的REST调用中接收一个空响应,而测试失败。

该助手创建的REST URL具有查询参数,如下所示:"http://server:port/application/resource?queryparam1=value1&queryparam2=value2“。

我尝试将URL ("http://server:port/application/resource")与"myURL“变量中的查询参数一起放置(以获得匹配以便返回响应),但无法让模拟服务器返回任何内容。

我尝试过搜索这类代码的示例,但是还没有找到类似于我的场景的任何东西。

春季版本4.1.7。

提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-13 07:11:23

创建MockRestServiceServer实例时,应使用生产代码使用的现有RestTemplate实例。因此,尝试将RestTemplate注入到您的测试中,并在调用MockRestServiceServer.createServer时使用它--不要在测试中创建新的RestTemplate

票数 16
EN

Stack Overflow用户

发布于 2016-06-13 07:48:28

似乎您正在尝试测试rest-客户机,rest-服务器应该在其他地方进行测试。您正在使用RestTemplate ->调用该服务。然后,试图嘲笑RestTemplate及其调用的结果。

代码语言:javascript
复制
@Mock
RestTemplate restTemplateMock;

和测试课程下的服务

代码语言:javascript
复制
@InjectMocks
Service service;

比方说,服务有一个方法需要测试,如

代码语言:javascript
复制
public void filterData() {
   MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class);
   // further processing with response
}

然后,要测试filterData方法,需要模拟来自restTemplate调用的响应,如

代码语言:javascript
复制
mockResponseModel = createMockResponse();
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel);

service.filterData();
//Other assert/verify,... go here
票数 4
EN

Stack Overflow用户

发布于 2019-07-25 05:45:57

您可以创建RestTemplate的新实例,但是必须在createServer方法中传递它,如下所示:

代码语言:javascript
复制
private RestTemplate restTemplate = new RestTemplate();
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
client.setRestTemplate(restTemplate);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37781982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档