首页 > 解决方案 > 测试包含模拟 JPA 存储库的服务时出现 NullPointerException

问题描述

我正在做我的第一个 Spring Boot 项目,但作为 Mockito 新手测试我的班级时遇到了麻烦。我需要检查下面的 findAndUpdateUser 方法是否正确更新了用户实体字段:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepo;

    public User findUser(String id) {
        return userRepo.findById(id);
    }

    public User findAndUpdateUser(String id) {
        User foundUser = findUser(id);
        //some update on foundUser fields
        return foundUser;
    }
}

为了测试,我需要模拟实体 bean,因为我本地没有数据库。这是我的测试课:

@RunWith(MockitoJUnitRunner.class)
public class UpdateFieldsTest {
    @Mock
    private UserRepository userRepo;

    @Test
    public void test1() {
        User user = new User();
        user.setId("testId");
        //setting some other user fields

        Mockito.when(userRepo.findById("testId")).thenReturn(user);
        UserServiceImpl userService = new userServiceImpl();
        User returnedUser = userService.findAndUpdateUser("testId");

        //Checking if user field values are updated after findAndUpdate call
        Assert.xxx
        //other asserts
    }
}

但是这段代码在方法调用上给了我一些 NullPointerException 。我什至试图模拟 findUser 方法,但我仍然有错误......

我有不好的方法吗?我应该如何测试我的方法?

欢迎任何帮助 谢谢大家

标签: javaspringmockingmockito

解决方案


模拟不会神奇地出现在您的对象内部。您需要手动注入它们。在您的测试中,在 内部userServiceuserRepo将是空的。您可以通过构造函数或 setter 注入依赖项。在您的测试中看起来像这样:

UserServiceImpl userService = new userServiceImpl(userRepo);

或者

UserServiceImpl userService = new userServiceImpl();
userService.setUserRepo(userRepo);

推荐阅读