Интеграционное тестирование контроллера пользовательских обновлений с MockMvc - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь проверить, правильно ли работает лог c за контроллером пользовательских обновлений, создав несколько простых интеграционных тестов с использованием Mock Mvc.

Я обновляю учетные данные пользователей, по соображениям безопасности пароль не возвращается в ответе 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. Тогда все в порядке, но кажется, что данные никогда не сохраняются в базе данных.

1 Ответ

0 голосов
/ 12 марта 2020

Полагаю, у вас есть тестовый пример с @Transactional сверху, это означает, что эта транзакция никогда не будет зафиксирована, поскольку это @Test.

Таким образом, когда вы делаете http вызов по restTemplate, транзакция не фиксируется и изменения не будут видны для конечной точки /logIn. (это обычный http-запрос, который не ограничен @Test @Transactional)

Вы можете использовать mockmvc вместо RestTemplate для вызова конечной точки входа в систему и подтверждения результатов. Оба mockmvc будут ограничены одной и той же транзакцией, и изменения будут видны.

РЕДАКТИРОВАТЬ

В случае, если / вход в систему не является частью этой службы, чем вы должны пользовательское хранилище чтобы получить пароль от БД в какой-то момент. repo.findUserByFirstName возможно и проверь, что тебе нужно. Поскольку этот вызов будет выполнен в той же транзакции, результат также будет действительным.

...