Spring Boot在测试运行期间不注册HttpMessageConverter
我正在运行一个Spring Boot应用程序,我已经注册了一个新的Spring Boot在测试运行期间不注册HttpMessageConverter,spring,spring-boot,rest-assured,spring-boot-test,Spring,Spring Boot,Rest Assured,Spring Boot Test,我正在运行一个Spring Boot应用程序,我已经注册了一个新的HttpMessageConverter,名为CsvCompactVenueHttpMessageConverter,下面是它的代码: @Component public class CsvCompactVenueHttpMessageConverter extends AbstractHttpMessageConverter<Collection<CompactVenue>> { pub
HttpMessageConverter
,名为CsvCompactVenueHttpMessageConverter
,下面是它的代码:
@Component
public class CsvCompactVenueHttpMessageConverter extends
AbstractHttpMessageConverter<Collection<CompactVenue>> {
public CsvCompactVenueHttpMessageConverter() {
super(MediaType.valueOf(TEXT_CSV));
}
>> message converter implementation code <<
}
然后我有一个叫做FoursquareResource
的rest资源:
@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);
}
}
}
我不知道为什么我在运行Spring Boot应用程序时得到了正确的答案,但在作为测试运行时却出现了406错误。看起来新的HttpMessageConverter
没有在测试中注册,但我不明白为什么。
感谢和问候。
406不可接受
仅表示控制员无法提供客户要求的陈述。在您的情况下,客户端通过发送Accept
标题指示其读取text/csv
的能力,但控制器无法发送text/csv
。很可能是缺少转换器。要了解原因,了解MockMvc
的一点很重要。
尚不清楚您的MockMvc
是如何初始化的,但我假设它是独立设置的。请注意,standaloneSetup
创建了一个新的应用程序上下文,其中来自标准配置的bean没有注册,包括自定义转换器。这解释了为什么代码在“正常”运行中工作,但在测试中失败。要克服这一问题,可以在注入的应用程序上下文中使用webAppContextSetup
(将启动应用程序和嵌入式Jetty/Tomcat),或者通过调用StandaloneMockMvcBuilder
上的setMessageConverters
手动设置转换器。比如说,
mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.setMessageConverters(new SomeConverter(),
new SomeOtherConverter())
.build();
然后,只需调用
RestAssuredMockMvc.mockMvc(mockMvc);
具有相同的问题,通过注入
HttpMessageConverters
并手动将其添加到MockMvc
对象中解决了该问题:
@Autowired
private HttpMessageConverter[] httpMessageConverters;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(myController).setMessageConverters(httpMessageConverters).build();
}
这应该行得通。它将导入您的
WebConfiguration
类
@WebMvcTest(controllers=FoursquareResource.class)
@导入(FoursquareService.class)
公共类Foursquare测试{
@自动连线
私有MockMvc-MockMvc;
@蚕豆
私人FoursquareService FoursquareService;
@试验
public void test()引发异常{
CompactVince=新的CompactVince();
FieldUtils.writeField(场地,“id”,“aUfmEW745”,真实);
收集地点=收集。单音列表(地点);
当(foursquareService.SearchVenues绑定并增加范围(any(),any())。然后返回(场馆);
字符串location=“location”;
int numQueries=4;
MockHttpServletResponse=mockMvc
.perform(get(“/foursquare/{location}?numquerys={numquerys}”),location,numquerys.contentType(“text/csv”))
.andExpect(状态().isOk())
.andDo(print())
.andReturn().getResponse();
log.info(response.getContentAsString());
}
}
WebConfiguration包是否至少与FoursquareResourceTest处于同一级别或嵌套在FoursquareResourceTest之下?如果不是,那可能就是问题所在。我假设您在某个地方有一个SpringBootApplication注释,否则,这也不行。是的,我在根路径上有一个@SpringBootApplication
。@ComponentScan
应该工作正常,因为它在运行应用程序时工作正常。
RestAssuredMockMvc.mockMvc(mockMvc);
@Autowired
private HttpMessageConverter[] httpMessageConverters;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(myController).setMessageConverters(httpMessageConverters).build();
}