繁体   English   中英

使用spring-data-jpa和MockMvc的Spring Boot Junit测试

[英]spring boot junit test with spring-data-jpa and 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。 我找到并得到一个用户对象。 以及在嘲笑Mvc.perform()处。 我找到并通过ID用户并对其进行更新。

但我得到相同的对象。 和mockMvc更新sampleUser对象。 因此测试assertNotEquals失败。

它怎么发生的? 请有人帮忙。

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

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

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

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

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

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

可以说,这两个测试都应该使用模拟的存储库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM