在我的RestController
内部模拟外部API调用的正确方法是什么。
意味着我的RestController
实际上执行了以下步骤:
由于安全问题而无法复制/粘贴,但是通常:
@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()
}
答案 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>")));