Как смоделировать BindingResult в Spring Boot Test - PullRequest
0 голосов
/ 24 августа 2018

У меня есть следующий контроллер:

@RestController
@RequestMapping(value = ROOT_MAPPING)
public class GatewayController
{
    @Autowired
    private RequestValidator requestValidator;

    @InitBinder
    protected void initBinder(WebDataBinder binder)
    {
        binder.addValidators(requestValidator);
    }

    @PostMapping(value = REDIRECT_MAPPING)
    public ResponseEntity<ResponseDTO> redirectEndpoint(@Validated @RequestBody RequestDTO requestDTO, BindingResult result)
    {
        if (result.hasErrors())
        {
            // Handle validation errors
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
        }

        // Do other stuff
        return ResponseEntity.status(HttpStatus.OK).build();
    }
}

И этот тестовый класс:

@RunWith(SpringRunner.class)
@WebMvcTest(GatewayController.class)
public class GatewayControllerTest
{
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private RequestValidator requestValidator;

    @MockBean
    private BindingResult bindingResult;

    private JacksonTester<RequestDTO> requestJacksonTester;

    @Before
    public void setUp() throws Exception
    {
        JacksonTester.initFields(this, new ObjectMapper());
        Mockito.when(requestValidator.supports(ArgumentMatchers.any())).thenReturn(true);
    }

    @Test
    public void whenRedirectWithValidationErrorsThenBadRequestReturned() throws Exception
    {
        RequestDTO request = new RequestDTO();
        // Set some values

        Mockito.when(bindingResult.hasErrors()).thenReturn(true);

        mockMvc.perform(MockMvcRequestBuilders.post(ROOT_MAPPING + REDIRECT_MAPPING).contentType(MediaType.APPLICATION_JSON).content(requestJacksonTester.write(request).getJson())).andExpect(MockMvcResultMatchers.status().isBadRequest());
    }
}

Когда я запускаю этот код, тестовый случай завершается неудачно по этой причине: Ожидаемый статус: 400 Фактический: 200

Итак, я хочу смоделировать BindingResult, переданный в качестве параметра методу redirectEndpoint в Контроллере, чтобы при вызове bindingResult.hasErrors() это возвращало true, и тестcase pass.

Я много раз искал, но безуспешно.Любые предложения, как это сделать?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 августа 2018

BindingResult не является bean в ApplicationContext. Таким образом, вы не можете макет через @MockBean.

Spring MVC создает для вас

A BindingResult для каждого входящего HTTP-запроса.

Таким образом, вы не хотите издеваться над BindingResult. На самом деле, вы, вероятно, тоже не хотите высмеивать поведение вашего RequestValidator. Скорее, вам в идеале следует использовать реальную реализацию RequestValidator, передать неверные данные запроса (через MockMvc) и затем проверить ответ соответствующим образом.

Обратите внимание, что вы можете включить реальную реализацию вашего RequestValidator через @Import(RequestValidator.class) в тестовом классе.

...