一尘不染

模拟resttemplate以将服务测试为restFul客户端

spring-boot

我有一个Spring编写的带有一些方法的服务类。其中之一充当了一个宁静的消费者,如下所示:

.....
        HttpEntity request = new HttpEntity<>(getHeadersForRequest());
        RestTemplate restTemplate = new RestTemplate();
        String url = ENDPOINT_URL.concat(ENDPOINT_API1);

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
                .queryParam("param1", parameter1);
        ReportModel infoModel = null;
        try{
            infoModel = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, ReportModel.class).getBody();
        }catch (HttpClientErrorException | HttpServerErrorException e){
            e.printStackTrace();
        }

我想用来Mockito模拟我的服务,但是与宁静服务器实例交互的每个方法都需要一个新的RestTemplate。我必须创建一个静态类以将其注入到我的服务中吗?


阅读 502

收藏
2020-05-30

共1个答案

一尘不染

依赖项注入的好处之一是能够轻松模拟依赖项。在您的情况下,创建一个RestTemplatebean 会容易得多:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

而不是new RestTemplate()在客户中使用,您应该使用:

@Autowired
private RestTemplate restTemplate;

对于使用Mockito进行的单元测试,您必须模拟RestTemplate,例如使用:

@RunWith(MockitoJUnitRunner.class)
public class ClientTest {
    @InjectMocks
    private Client client;
    @Mock
    private RestTemplate restTemplate;
}

在这种情况下,Mockito会模拟并将RestTemplateBean
注入您的Client。如果您不喜欢通过反射进行RestTemplate模拟和注入,则可以随时使用单独的构造函数或设置器来注入模拟。

现在您可以编写如下测试:

client.doStuff();
verify(restTemplate).exchange(anyString(), eq(HttpMethod.GET), any(HttpModel.class), eq(ReportModel.class));

您可能需要进行更多测试,但这会给您一个基本的想法。

2020-05-30