使用自定义返回值处理程序进行java MockMVC异步测试
我试图使用MockMvc测试我的spring4.1控制器,结果是异步的。我遵循了这里描述的相同模式:
但是,我的测试不同,因为我使用的是返回值处理程序,如下所述:
https://github.com/AndreasKl/spring-boot-mvc-completablefuture
下面是我的测试代码的样子:
public class MyControllerTest {
private MockMvc mockMvc;
private MyService myService;
private MyController myController;
public MappingJackson2HttpMessageConverter createMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
List<MediaType> supportedMediaTypes = Arrays.asList(MediaTypes.JSON_V1);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converter.setSupportedMediaTypes(supportedMediaTypes);
return converter;
}
@Before
public void setup() throws Exception {
MappingJackson2HttpMessageConverter converter = createMessageConverter();
myService = mock(MyService.class);
controller = new MyController(myService);
mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setMessageConverters(converter)
.setCustomReturnValueHandlers(new CompletableFutureReturnValueHandler())
.build();
}
@Test
public void test() throws Exception {
String value = "foo";
CompletableFuture<ExampleData> futureValue =
CompletableFuture.completedFuture(new ExampleData(value));
when(myService.getExample()).thenReturn(futureValue);
MvcResult mvcResult = mockMvc.perform(get("/example"))
.andExpect(status().isOk())
.andExpect(request().asyncStarted())
.andExpect(request().asyncResult(instanceOf(ExampleData.class)))
.andReturn();
mockMvc.perform(asyncDispatch(mvcResult))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaTypes.JSON_V1_VALUE))
.andExpect(jsonPath("$.property", is(value)));
}
}
似乎即使我使用StandaloneMockMvcBuilder设置返回值处理程序。setCustomReturnValueHandlers(),从未调用它。这将导致request()的断言。asyncStarted()失败,因为结果不是可调用或延迟的结果
我是否正确设置了处理程序,或者是否缺少其他内容
==解决方案======
在阅读文档并逐步使用调试器之后,我发现setCustomReturnValueHandlers()将处理程序添加到列表的末尾,而spring boot mvc completablefuture示例将其插入到延迟结果处理程序之前。使用非独立模式将允许这样做
共 (0) 个答案