gpt4 book ai didi

Spring Boot 在测试运行期间不注册 HttpMessageConverter

转载 作者:行者123 更新时间:2023-12-05 05:21:08 24 4
gpt4 key购买 nike

我正在运行一个 Spring Boot 应用程序,我已经注册了一个名为 CsvCompactVenueHttpMessageConverter 的新 HttpMessageConverter,这是它的代码:

@Component
public class CsvCompactVenueHttpMessageConverter extends
AbstractHttpMessageConverter<Collection<CompactVenue>> {

public CsvCompactVenueHttpMessageConverter() {
super(MediaType.valueOf(TEXT_CSV));
}

>> message converter implementation code <<
}

它扩展了 AbstractHttpMessageConverter 并在类 WebConfiguration 上注册为一个 bean:

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {

@Bean
public CsvCompactVenueHttpMessageConverter csvCompactVenueHttpMessageConverter() {
return new CsvCompactVenueHttpMessageConverter();
}
}

然后我有一个名为 FoursquareResource 的休息资源:

@RestController
@RequestMapping("/foursquare")
public class FoursquareResource {

@Autowired
FoursquareService foursquareService;

@GetMapping(value = "/{location}", produces = {"application/json", "text/csv"})
public Collection<CompactVenue> searchVenuesByLocationAndIncreasingRange(@PathVariable String location, @RequestParam(defaultValue = "1") Integer numQueries) throws FoursquareApiException, FoursquareServiceException {
return foursquareService.searchVenuesByLocationAndIncreasingRange(location, numQueries);
}
}

当我运行应用程序并调用 http://localhost:8080/foursquare/New York NY 时,它工作正常并呈现 text/csv 响应。

但是当使用 RestAssured 和 @SpringBootTest 运行测试时,我得到一个 HTTP 406 响应(因为我认为它没有正确注册 HttpMessageConverter for text/csv),这里是代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class FoursquareResourceTest {

@Mock
FoursquareService foursquareService;

@InjectMocks
FoursquareResource foursquareResource;

@Before
public void before() throws Exception {
CompactVenue venue = new CompactVenue();
FieldUtils.writeField(venue, "id", "aUfmEW745", true);
Collection<CompactVenue> venues = new ArrayList<>();
venues.add(venue);
when(foursquareService.searchVenuesByLocationAndIncreasingRange(any(), any())).thenReturn(venues);
}

@Test
public void testSearchVenuesByLocationAndIncreasingRangeCsv() throws Exception {
MockMvcResponse response =
given().
accept("text/csv").
standaloneSetup(foursquareResource).
when().
get(String.format("/foursquare/%s?numQueries=%d",location,numQueries)).
then().
statusCode(200).
extract().response();

log.info(response.body().print());
}

我不确定为什么在运行 Spring Boot 应用程序时会得到正确答案,但在作为测试运行时会出现 406 错误。看起来新的 HttpMessageConverter 没有在测试中注册,但我不明白为什么。谢谢和问候。

最佳答案

406 Not Acceptable 仅表示 Controller 无法提供客户端请求的表示。在您的情况下,客户端通过发送 Accept header 指示其读取 text/csv 的能力,但 Controller 无法发送 text/csv背部。很可能缺少您的转换器。要理解原因,了解关于 MockMvc 的一件事很重要。目前尚不清楚您的 MockMvc 是如何初始化的,但我认为它是独立设置。请注意,standaloneSetup 创建了一个 应用程序上下文,您的标准配置中的 bean 未在其中注册,包括您的自定义转换器。这解释了为什么代码在“正常”运行中工作,但在测试中失败。为了克服这个问题,要么使用注入(inject)应用程序上下文的webAppContextSetup(它将启动应用程序和嵌入式 Jetty/Tomcat),要么通过调用 StandaloneMockMvcBuilder 上的 setMessageConverters 手动设置转换器。例如,

mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.setMessageConverters(new SomeConverter(),
new SomeOtherConverter())
.build();

然后您可以在您的 REST Assure 中重用 mockMvc 对象,只需调用

RestAssuredMockMvc.mockMvc(mockMvc);

关于Spring Boot 在测试运行期间不注册 HttpMessageConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43335072/

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