我正在运行一个 Spring Boot 应用程序,并且我已经注册了一个新的HttpMessageConverter名为CsvCompactVenueHttpMessageConverter,这是它的代码:
@Component
public class CsvCompactVenueHttpMessageConverter extends
AbstractHttpMessageConverter<Collection<CompactVenue>> {
public CsvCompactVenueHttpMessageConverter() {
super(MediaType.valueOf(TEXT_CSV));
}
>> message converter implementation code <<
}
它扩展AbstractHttpMessageConverter并注册为 class 上的 bean WebConfiguration:
@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 响应(因为我认为它没有正确注册HttpMessageConverterfor 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的没有在测试中注册,但我不明白为什么。谢谢并恭祝安康。