如何在单元测试中模拟 JPA 存储库的保存方法 [英] How to mock JPA repository's save method in unit tests

查看:31
本文介绍了如何在单元测试中模拟 JPA 存储库的保存方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如我在 UserService 中有这个方法:

For example, I have this method in UserService:

  @Override
  @Transactional
  public UserDto create(UserDto userDto) {

    User dbUser = userRepository.findOne(userDto.getId());

    if (dbUser != null) {
      throw new AuthException(AuthException.ErrorCode.DUPLICATE_USER_EXCEPTION);
    }

    User oneByLogin = userRepository.findOneByLogin(userDto.getLogin());
    if (oneByLogin != null) {
      throw new AuthExceptionAuthException.ErrorCode.DUPLICATE_LOGIN_EXCEPTION);
    }

    User newUser = new User();
    newUser.setGuid(UUID.randomUUID().toString());
    newUser.setInsertDate(new Date());
    newUser.setFirstName(userDto.getFirstName());
    newUser.setLastName(userDto.getLastName());
    newUser.setLogin(userDto.getLogin());
    newUser.setPassword(userDto.getPassword());
    newUser.setAuthToken(TokenGenerator.nextToken());
    newUser.setAuthTokenCreatedDate(new Date());

    User savedUser = userRepository.save(newUser);

    userDto.setAuthToken(savedUser.getAuthToken());
    log.info("User {0} created", savedUser.getLogin());
    return userDto;
  }

如何为该方法创建单元测试?我尝试了下一个:

How can I create unit test for this method? I tried next:

  @Test
  public void createUser() {

    UserDto userDtoRequest = new UserDto();
    userDtoRequest.setLogin("Alex");
    userDtoRequest.setPassword("123");

    UserDto found = userService.create(userDtoRequest);
    assertThat(found.getAuthToken()).isNotEmpty();
}

我有下一个逻辑:

  1. 测试开始
  2. User dbUser = userRepository.findOne(userDto.getId()); dbUser = NULL
  3. if (dbUser != null) 和 if (oneByLogin != null) 跳过
  4. 创建新用户并设置数据
  5. User savedUser = userRepository.save(newUser); savedUser = NULL
  1. Test start
  2. User dbUser = userRepository.findOne(userDto.getId()); dbUser = NULL
  3. if (dbUser != null) and if (oneByLogin != null) skip
  4. create new user and set data
  5. User savedUser = userRepository.save(newUser); savedUser = NULL

在这一步中,我遇到了一个问题,因为我无法模拟 userRepository.save(newUser).

On this step, I have a problem because I cannot mock userRepository.save(newUser).

newUser create inside the method. and test fail.

savedUser.getAuthToken() - savedUser == NULL

savedUser.getAuthToken() - savedUser == NULL

我可以重写:

    userRepository.save(newUser);
    userDto.setAuthToken(newUser.getAuthToken());
    log.info("User {0} created", newUser.getLogin());
    return userDto;

但是如果我想使用返回的对象savedUser怎么办?

but what if I want to use the returned object savedUser?

推荐答案

你需要这样做.

when(userRepository.save(Mockito.any(User.class)))
                .thenAnswer(i -> i.getArguments()[0]);

现在您可以获取作为参数传递的用户.

And now you can obtain user which you pass as argument.

这篇关于如何在单元测试中模拟 JPA 存储库的保存方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆