测试 RestTemplate 拦截器

我已经为RestTemplate(RestTemplateInterceptor.class)实现了一个拦截器:


@Autowired

private RestConfigurations configurations;


@Bean

public RestTemplate restTemplate(RestTemplateBuilder builder) {

    return builder.additionalInterceptors((ClientHttpRequestInterceptor) (httpRequest, bytes, clientHttpRequestExecution) -> {

        HttpHeaders headers = httpRequest.getHeaders();

        headers.add("X-API-KEY", configurations.getApiKey());


        return clientHttpRequestExecution.execute(httpRequest,bytes);

    }).build();

}

现在我想测试一下。:) 一次尝试看起来像这样:


@ExtendWith(SpringExtension.class)

@RestClientTest({RestTemplateInterceptor.class, RestConfigurations.class})

@AutoConfigureMockMvc

@SpringBootTest

class MyTestClass {

public static final String URL = "http://testMe.com/";


@Autowired

MockRestServiceServer mockServer;


@Autowired

RestTemplateBuilder restTemplateBuilder;


@Test

@DisplayName("Should include header X-API-KEY")

void headerShouldContainsXApiKey() throws Exception {

    mockServer.expect(requestTo(URL)).andRespond(withSuccess("Hello world", TEXT_PLAIN));


    String body = restTemplateBuilder.build().exchange(URL//

            , GET, //

            null,  //

            String.class).getBody();

    assertThat(body).isEqualTo("Hello world");


    mockServer.expect(header("X-API-KEY", ""));

}

但我失败了:


java.lang.AssertionError: 预期没有进一步的请求:HTTP GET http://test.hornbach.de/ 0 个请求已执行。


任何人的提示?谢谢


慕的地8271018
浏览 216回答 1
1回答

qq_花开花谢_0

如果您查看Javadoc,您会看到当您调用 时additionalInterceptors,您并没有修改现有的构建器实例,而是获得了一个配置略有不同的新构建器。当您然后调用restTemplateBuilder.build()您的测试用例时,您正在构建一个具有未修改配置的模板。测试此类事情的理想方法是直接在拦截器实例本身上执行此操作,但是如果您想通过调用模拟服务器来执行功能测试,则应该将已完成的RestTemplate实例注入到您的测试用例中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java