在春季启动中测试链接的REST API

时间:2019-04-03 12:29:37

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

在我的RestController内部模拟外部API调用的正确方法是什么。 意味着我的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()
}

2 个答案:

答案 0 :(得分:1)

在这里,您正在创建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声明响应。

答案 1 :(得分:0)

在集成测试中,我一直使用Wiremock进行更复杂的存根测试。

这是一个可以添加为依赖项的库,让我们在测试上下文中对任何指定的端点(甚至是外部端点)进行存根。

项目文档中的示例存根:

stubFor(get(urlEqualTo("/my/resource"))
            .withHeader("Accept", equalTo("text/xml"))
            .willReturn(aResponse()
                .withStatus(200)
                .withHeader("Content-Type", "text/xml")
                .withBody("<response>Some content</response>")));