Я пытаюсь проверить, правильно ли работает логика контроллера обновления пользователя, создав несколько простых интеграционных тестов с использованием MockMvc.
Я обновляю учетные данные пользователей, по соображениям безопасности пароль не возвращается в ответе dto, таким образом я могу ограничить количество паролей, которыми обмениваются клиент и сервер.
Проблема в том, как проверить, действительно ли пароль был обновлен до отката теста?
Я попытался вручную выполнить вход в систему до завершения теста, и если вход в систему с исходными учетными данными завершился неудачно, пароль был обновлен.
Самая простая часть теста проста:
@Test
void WhenUserIsAdmin_UserCanUpdateAllFields() throws Exception {
updatedUser.setPassword("newPassword");
String jsonString = mapper.writeValueAsString(updatedUser);
MockHttpServletRequestBuilder builder = TestRequestFactory.authorizationFactoryPUT(URI, "admin");
mockMvc.perform(builder.contentType(MediaType.APPLICATION_JSON).content(jsonString))
.andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.firstName").value("admin2"))
.andExpect(MockMvcResultMatchers.jsonPath("$.surnamePaternal").value("admin2"))
.andExpect(MockMvcResultMatchers.jsonPath("$.surnameMaternal").value("admin2"))
.andExpect(MockMvcResultMatchers.jsonPath("$.roleName").value("User"))
.andExpect(MockMvcResultMatchers.jsonPath("$.roleType").value("ROLE_USER"))
.andExpect(MockMvcResultMatchers.jsonPath("$.created").isNotEmpty());
}
и Фабрика выглядит так
public static MockHttpServletRequestBuilder authorizationFactoryPUT(String url, String user)
throws JsonProcessingException {
return MockMvcRequestBuilders.put(url)
.header(HttpHeaders.AUTHORIZATION, doLogin(user, user));
}
static String doLogin(String user, String pass) throws JsonProcessingException {
LoginRequest loginRequest = new LoginRequest(user, pass);
String resultAsJsonString = restTemplate.postForEntity(loginServer + "/login", loginRequest, String.class).getBody();
LoginResponse loginResponse = mapper.readValue(Objects.requireNonNull(resultAsJsonString), LoginResponse.class);
return loginResponse.getTokenType() + " " + loginResponse.getAccessToken();
}
и внутри того же теста, который я пробовал
LoginRequest loginRequest = new LoginRequest(user, pass);
String resultAsJsonString = restTemplate.postForEntity(loginServer + "/login", loginRequest, String.class).getBody();
LoginResponse loginResponse = mapper.readValue(Objects.requireNonNull(resultAsJsonString), LoginResponse.class);
и если ответ не выполняется во время сопоставления или код ответа HTTP - 401. Тогда все в порядке, но похоже, что данные никогда не сохраняются в базе данных.
@Transactional
на@Test
? - person Nonika   schedule 12.03.2020