TransWikia.com

Как протестировать POST контроллер через WebMVC?

Stack Overflow на русском Asked by witi on November 15, 2021

Уже второй день гуглю, но все безуспешно. Помогите, пожалуйста.. Необходимо протестировать метод контроллера EmployeeController. Метод:

@PostMapping("/current/update-email")
    public ResponseEntity<String> updateEmail(@RequestBody String email) {
        if (!StringUtils.isEmpty(email)) {
            String emailVerificationPattern = "^[a-zA-Zа-яА-ЯёЁ0-9.-]+@[a-zA-Zа-яА-ЯёЁ0-9.-]+$";
            Pattern validEmailPattern = Pattern.compile(emailVerificationPattern);
            boolean isEmailValid = validEmailPattern.matcher(email).matches();

            if (isEmailValid) {
                Employee employee = securityService.getCurrentEmployee();
                employee.setEmail(email);
                employeeService.save(employee);
                return ResponseEntity.ok("Email changed!");
            } else {
                return ResponseEntity.badRequest().body("Email value is invalid");
            }
        } else {
            return ResponseEntity.badRequest().body("Email is empty");
        }
    }

Код самого реквеста на фронте:

export const updateEmail = (history, email) =>
  fetch(`/hr-rest/employees/current/update-email`, {
    method: "POST",
    ...getCommonJsonRequestProps(),
    body: email,
  })
    .then(response => throwHttpErrors(response, history))
    .then(response => response.json())
    .then(users => users || []);

Собственно, что я имею сейчас:

@RunWith(SpringRunner.class)
@WebMvcTest(EmployeeController.class)
@ContextConfiguration(classes={MQAutoConfiguration.class, JmsAutoConfiguration.class})
public class EmployeeControllerTest {
    @Autowired
    private MockMvc mvc;
    @Autowired
    private ObjectMapper mapper;
    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before()
    public void setup()
    {
        mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void updateEmail() throws Exception
    {
        mvc.perform(MockMvcRequestBuilders
            .post("/current/update-email")
            .content(asJsonString(mapper.writeValueAsString("[email protected]")))
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.email").exists());
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Получаю ошибку:

EmployeeControllerTest.updateEmail:72 Status expected:<200> but was:<404>

Понимаю, что скорей всего контент описан неверно, но не знаю, как описать правильно.
Буду крайне рад любой помощи, спасибо.

One Answer

На сколько я понимаю контроллер не был создан при инициализации контекста.

На мой взгляд наиболее правильно будет заменить @ContextConfiguration(classes={MQAutoConfiguration.class, JmsAutoConfiguration.class}) на @Import({MQAutoConfiguration.class, JmsAutoConfiguration.class})

Похожие обсуждения в английской версии:

Answered by Alexandr on November 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP