首页 > 解决方案 > 在 Spring Boot 中测试链式 REST API

问题描述

在我的RestController. 这意味着我RestController实际上做了这些步骤:

  1. 日期转换
  2. 使用数据调用外部 API
  3. 使用外部 API 响应进行响应

由于安全问题,无法复制/粘贴,但通常:

@RestController
public Class x{
RestTemplate y = new RestTemplate();

@RequestMapping(value="/someurl" , method=RequestMethod=POST)
public String myMethod(@RequestBody JsonNode myjson)
{
  //business logic
  ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod,
                                          internalRequest,String.class);
  return response.getBody()
}

标签: spring-bootspring-testspring-boot-testspring-test-mvc

解决方案


在这里,您正在创建一个新的 RestTemplate 实例。您可以考虑在 Configuration 类中定义 RestTemplate 的 bean,并在此处自动装配它以使用 Mockito 框架对其进行模拟和测试。

然后控制器中的代码必须如下所示。

@RestController
public Class Controller{

   @Autowired
   RestTemplate restTemplate;

RestTemplate bean 应该在配置类中定义如下

@Configuration
public class Config {

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
  }
} 

完成上述操作后,您可以模拟 RestTemplate 如下

@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {

  @Mock
  RestTemplate restTemplate;

  @InjectMocks
  Controller controller;

  @Test
  public void myMethodTest() {
     Mockito.when(restTemplate.exchange(Mockito.eq(your url), 
                 Mockito.eq(HttpMethod.your method), Mockito.<HttpEntity<your request 
                 class>> any(), Mockito.<Class<your response class>> 
                 any())).thenReturn(your response entity);
     String response = controller.myMethod(your request);
     Assert.assertThat(response, CoreMatchers.is((your response entity).getBody));
  }

使用上述内容,您可以断言来自模拟的 restTemplate 的响应。


推荐阅读