使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试

Posted

技术标签:

【中文标题】使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试【英文标题】:spring boot junit test with spring-data-jpa and MockMvc 【发布时间】:2018-05-25 14:36:17 【问题描述】:

我正在编写一些测试代码。 我使用 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());

在示例用户。我找到并得到一个用户对象。 在 mockMvc.perform()。我通过 id 查找和用户并更新它。

但我得到相同的对象。并且 mockMvc 更新 sampleUser 对象。 所以测试 assertNotEquals 失败。

这怎么可能发生? 请有人帮忙。

【问题讨论】:

您能否提供有关您可能在何处使用事务、@Transactional 以及一般数据源的其他信息? 【参考方案1】:

这是交易的影响。您在一个事务 (T1) 中加载您的使用。

然后您通过 MockMvc 执行另一个事务 (T2) 更改用户。

但您的测试仍在事务 T1 中,不会看到更改。实际上由于 JPA 的行为,它甚至不会访问数据库,而只是从实体管理器中提取它。

在测试中没有简单的方法来“修复”这个问题。 相反,我建议将您的测试分成两个或多个单独的测试:

验证您的 MVC 设置的测试,确保调用正确的方法并返回预期的 HTTP 状态代码和内容。

一个单独的测试,确保该方法确实对您的实体进行了预期的更改并调用了存储库。

这两个测试都应该使用模拟存储库。

【讨论】:

以上是关于使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试的主要内容,如果未能解决你的问题,请参考以下文章

纯干货,Spring-data-jpa详解(转)

Spring-data-jpa详解,全方位介绍。

Spring-data-jpa详解,全方位介绍。

使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试

纯干货,Spring-data-jpa详解,全方位介绍

处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型