java - 测试包含模拟 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 方法,但我仍然有错误......
我有不好的方法吗?我应该如何测试我的方法?
欢迎任何帮助 谢谢大家
解决方案
模拟不会神奇地出现在您的对象内部。您需要手动注入它们。在您的测试中,在 内部userService
,userRepo
将是空的。您可以通过构造函数或 setter 注入依赖项。在您的测试中看起来像这样:
UserServiceImpl userService = new userServiceImpl(userRepo);
或者
UserServiceImpl userService = new userServiceImpl();
userService.setUserRepo(userRepo);
推荐阅读
- php - 使用 PHP 打开 HTML 和 JS 文件并搜索特定关键字
- android - 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' 在空对象引用上
- javascript - 在哪里可以找到或覆盖 _navbar.scss?
- javascript - 当 ng-model 设置为 false 时,仍然检查脏复选框
- html - 使文本倒置显示,CSS 和 HTML5
- sh - 将脚本作为服务运行的 Systemd 配置
- postgresql - 外键检查是在语句之后还是在每次修改之后运行?
- in-app-purchase - 来自 Google Play 的应用内购买
- css - 相同的样式表在浏览器和存储它的服务器上的显示方式不同
- solr - 匹配多值日期范围字段的单个值