2017-02-06 12 views
1

Мне нужно протестировать контроллер, который вызывает асинхронную службу.MockMVC выполнить пост-тест для асинхронной службы

CONTROLLER КОД

@RequestMapping(value = "/path", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<Result> massiveImport(HttpServletRequest request) { 
    try { 
     service.asyncMethod(request); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return new ResponseEntity<>(new Result(e.getMessage()), HttpStatus.BAD_REQUEST); 
    } 

    return new ResponseEntity<>(new Result(saveContact.toString()), HttpStatus.OK); 
} 

SERVICE CODE

@Async 
public Future<Integer> asyncMethod(HttpServletRequest request) throws IllegalFieldValueException, Exception { 
    ... 
    return new AsyncResult<>(value); 
} 

TEST CODE

MvcResult result = getMvc().perform(MockMvcRequestBuilders.fileUpload("/path/") 
          .header("X-Auth-Token", accessToken) 
          .accept(MediaType.APPLICATION_JSON)) 
          .andDo(print()) 
          .andReturn(); 

Тест нормально. Но я бы подождал, прежде чем закрыть тест, чтобы завершить асинхронную службу.

Есть ли способ сделать это?

ответ

1

Если вы просто хотите дождаться завершения асинхронного исполнения, просмотрите MvcResult. Вы можете подождать с getAsyncResult().

С вашим текущим кодом вы просто выполняете запрос без каких-либо утверждений. Таким образом, тест не завершен. Для полного теста он выполняет следующие два шага.

Сначала выполните запрос:

MvcResult mvcResult = getMvc().perform(fileUpload("/path/") 
           .header("X-Auth-Token", accessToken) 
           .accept(MediaType.APPLICATION_JSON)) 
           .andExpect(request().asyncStarted()) 
           .andReturn(); 

Затем начать асинхронную отправку через asyncDispatch и выполнять утверждения:

getMvc().perform(asyncDispatch(mvcResult)) 
     .andExpect(status().isOk()) 
     .andExpect(content().contentType(...)) 
     .andExpect(content().string(...));