gpt4 book ai didi

java - 由于未绑定(bind)的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:39 30 4
gpt4 key购买 nike

编辑:这个问题专门与 spring-boot 1.4.0 中引入的 @RestClientTest 注释有关,该注释旨在替换工厂方法。

问题:

根据documentation @RestClientTest 应该正确配置 MockRestServiceServer 以在测试 REST 客户端时使用。但是,在运行测试时,我收到 IllegalStateException 消息,指出 MockServerRestTemplateCustomizer 尚未绑定(bind)到 RestTemplate。

值得注意的是,我使用 Gson 进行反序列化而不是 Jackson,因此排除。

有谁知道如何正确使用这个新注解?当我已经找到时,我还没有找到任何需要更多配置的示例。

配置:

@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration(exclude = {JacksonAutoConfiguration.class})
public class ClientConfiguration {

...

@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder()
.rootUri(rootUri)
.basicAuthorization(username, password);
}
}

客户:

@Service
public class ComponentsClientImpl implements ComponentsClient {

private RestTemplate restTemplate;

@Autowired
public ComponentsClientImpl(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}

public ResponseDTO getComponentDetails(RequestDTO requestDTO) {
HttpEntity<RequestDTO> entity = new HttpEntity<>(requestDTO);
ResponseEntity<ResponseDTO> response =
restTemplate.postForEntity("/api", entity, ResponseDTO.class);
return response.getBody();
}
}

测试

@RunWith(SpringRunner.class)
@RestClientTest(ComponentsClientImpl.class)
public class ComponentsClientTest {

@Autowired
private ComponentsClient client;

@Autowired
private MockRestServiceServer server;

@Test
public void getComponentDetailsWhenResultIsSuccessShouldReturnComponentDetails() throws Exception {
server.expect(requestTo("/api"))
.andRespond(withSuccess(getResponseJson(), APPLICATION_JSON));

ResponseDTO response = client.getComponentDetails(requestDto);
ResponseDTO expected = responseFromJson(getResponseJson());

assertThat(response, is(expectedResponse));
}
}

异常(exception)情况:

java.lang.IllegalStateException: Unable to use auto-configured MockRestServiceServer since MockServerRestTemplateCustomizer has not been bound to a RestTemplate

回答:

根据下面的回答,不需要在上下文中声明 RestTemplateBuilder bean,因为它已经由 spring-boot 自动配置提供。

如果项目是一个 spring-boot 应用程序(它有 @SpringBootApplication 注释)这将按预期工作。然而,在上述情况下,该项目是一个客户端库,因此没有主要应用程序。

为了确保 RestTemplateBuilder 被正确地注入(inject)到主应用程序上下文中(bean 已被删除),组件扫描需要一个自定义过滤器(@SpringBootApplication 使用的过滤器)

@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)
})

最佳答案

MockRestServiceServer 实例应该使用 RestTemplate 从静态工厂构建。参见 this文章详细描述了测试过程。

在您的示例中,您可以:

@RunWith(SpringRunner.class)
@RestClientTest(ComponentsClientImpl.class)
public class ComponentsClientTest {

@Autowired
private ComponentsClient client;

@Autowired
private RestTemplate template;

private MockRestServiceServer server;

@Before
public void setUp() {
server= MockRestServiceServer.createServer(restTemplate);
}

/*Do your test*/
}

关于java - 由于未绑定(bind)的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070654/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com