#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);