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

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

我正在运行一个Spring Boot应用程序,我已经注册了一个新的
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();
}