Nano Hash - криптовалюты, майнинг, программирование

тест весенней загрузки junit с spring-data-jpa и MockMvc

Пишу тестовый код. Я использую spring-boot 1.5.9.RELEASE.

это мой тестовый код

@Test
public void shouldUpdateUserName() throws JsonProcessingException, Exception {
    for(UserDto.Request request: userRequests) {
        User user = new User();
        user.setName(request.getName());
        user.setCity(cityRepository.findTopByName(request.getCity()));

        userRepository.save(user);
    }

    UserDto.Request sample = userRequests.get(new Random().nextInt(count));
    User sampleUser = userRepository.findTopByName(sample.getName());

    String userNameAfterUpdate = sampleUser.getName() + Thread.currentThread().getName();

    UserDto.Request request = new UserDto.Request();
    request.setCity(sampleUser.getCity().getName());
    request.setName(userNameAfterUpdate);

    mockMvc.perform(put("/user/" + sampleUser.getId())
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(request)))
        .andDo(print())
        .andExpect(status().isOk());

    assertNotEquals(sampleUser.getName(), userRepository.findOne(sampleUser.getId()).getName());
    assertEquals(userNameAfterUpdate, userRepository.findOne(sampleUser.getId()).getName());
}

в SampleUser. я нахожу и получаю пользовательский объект. и в mockMvc.perform(). я нахожу пользователя по идентификатору и обновляю его.

но я получаю тот же объект. и mockMvc обновляет объект sampleUser. поэтому тест assertNotEquals не проходит.

как это не случилось? пожалуйста, помогите.


  • Можете ли вы предоставить дополнительную информацию о том, где вы можете использовать транзакции, @Transactional, а также ваш источник данных в целом? 13.12.2017

Ответы:


1

Это эффект транзакций. Вы загружаете свое использование в одну транзакцию (T1).

Затем вы через MockMvc выполняете другую транзакцию (T2), изменяя пользователя.

Но ваш тест все еще находится в транзакции T1 и не увидит изменений. На самом деле из-за поведения JPA он даже не будет обращаться к базе данных, а просто извлечет ее из диспетчера сущностей.

Нет простого способа «исправить» это в тесте. Вместо этого я бы рекомендовал разделить ваши тесты на два или более отдельных теста:

Один тест, проверяющий настройку MVC, обеспечивающий вызов правильного метода и возврат ожидаемого кода состояния HTTP и содержимого.

Отдельный тест, гарантирующий, что метод действительно вносит ожидаемые изменения в вашу сущность и вызывает репозиторий.

Оба теста, возможно, должны использовать фиктивный репозиторий.

12.12.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..