Макет терпит неудачу при условии If

#unit-testing #spring-boot #spring-mvc #junit #mockito

#модульное тестирование #весенняя загрузка #spring-mvc #junit #mockito

Вопрос:

В моем контроллере я выполняю проверку правильности в if блоке, используя класс validator.

Поскольку код проверки еще не завершен, я просто хочу проверить, что если проверка прошла успешно, ответ должен быть 201 (Успех).

Для этого я имитирую поведение объекта validator для возврата true , т. е. его допустимый.

Проблема в том, что даже если я подделал поведение объекта validator, чтобы не вводить if блок, поэтому он не выдает исключение проверки, а фактически вводит и выбрасывает исключение. Это означает, что макет не сработал. Я знаю, что плохо предполагать реализацию метода для тестирования, но я хочу знать, почему он не работает.

myController.class

 @RestController
@RequestMapping("/v1/api")
public class myController {


    @Autowired
    private RequestService requestService;

    @Autowired
    RequestValidator validator;

    @PostMapping(value = "")
    @ResponseStatus(code = HttpStatus.CREATED)
    public @ResponseBody
    BaseResponse<Response> create(@RequestBody Request<Data> request){


        if(!validator.isValidRequestObject(request))
        {
            throw new RuntimeException("invalid request");
        }

        Response data = requestService.submitData(request);
        BaseResponse<Response> response = new BaseResponse<Response>();
        response.setData(data); 
        response.setMessage("Created Successfully");
        return response;


    }
  

ControllerTest.class

 @RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    Request<Data> request;

    @MockBean
    RequestService service;

    @MockBean
    RequestValidator validator;

    ObjectMapper mapper = new ObjectMapper();

    @Test
    public void createTest() throws Exception {

        when(validator.isValidRequestObject(request)).thenReturn(true);
        when(service.submitData(request)).thenReturn(null);

        this.mockMvc.perform(post("/v1/api")
                             .content(mapper.writeValueAsString(request))
                             .contentType(MediaType.APPLICATION_JSON))
                    .andExpect(status().isCreated());

    }
  

Если я удалю throw new exception строку, тест пройдет.
я предполагаю, что, поскольку я издевался над validator поведением в myController
это не должно входить в блок if и, следовательно, не вызывать исключение.
Но он входит в if блок и выдает исключение, игнорирующее имитируемое поведение.

Комментарии:

1. Запрос, который вы сериализуете, и запрос, переданный валидатору после десериализации, скорее всего, не равны.

2. но я смоделировал поведение проверки, чтобы всегда возвращать true, т. е. действительный. Поэтому независимо от того, какой объект я передаю, он должен возвращать true.

3. я получил ответ, это просто изменение строки, когда (validator.isValidMandateRequestObject(any(MandateRequest.class ))).thenReturn(true);