java - 如何在 Junit4 中测试调用私有方法的方法
问题描述
我必须测试一个 DAO 类,它本身调用一个私有方法。我正在使用 Junit4 和 ReflectionTestUtils。
class UserProfileDAO
{
public void saveOrUpdate(UserProfileEntity userProfile) {
try {
userProfile.setDateUpdated(new Date());
dynamoDB.save(userProfile, getTableName());
}
catch (Exception ex) {
log.error("Error occured while saving data to dynamoDB" + ex);
}
}
public String getTableName() {
return tableNameResolver.getTableName(PropertyEnum.DYNAMODB_OPX_USER_PROFILES_TABLE.getCode());
}
}
我的测试课
@Test
public void saveOrUpdate() {
String opxUserID= "50000";
UserProfileEntity expected = createUserProfileEntity(opxUserID);
expected.setUserProfileID(12);
userProfileDynamoDAO.saveOrUpdate(expected);
// load saved entity
UserProfileEntity actual = mapper.load(UserProfileEntity.class, opxUserID);
log.info(actual.toString());
assertNotNull(actual);
assertEquals(expected, actual);
}
但是我在 getTableName() 上得到了 NPE
解决方案
根据 OP 中提供的信息,似乎UserProfileDAO类在您的测试中被实例化而没有设置tableNameResolver属性。
我建议您在单元测试中使用模拟框架,例如Mockito。您可以使用此框架提供一个模拟实例作为tableNameResolver属性的值,然后将其设置在实际的实例中,这会在单元测试执行期间导致 NPE。
考虑到您的单元测试实际上是一个集成测试(即涉及多个类的代码流,并且显然正在测试持久层而不是 API 的简单实现),另一种方法可能是在测试单元的初始化,但是这会对单元测试的性能产生负面影响。
推荐阅读
- javascript - Sequelize hasOne() / hasMany() 和 BelongsTo() 复制外键(创建一个新的并重新定义它),并重新宣布它为键
- amazon-web-services - 为什么 AWS 将停用具有多容器支持的 Elastic Beanstalk?
- javascript - 是否可以访问这些符号中的任何一个?
- python-3.x - TypeError:输入类型不支持 ufunc 'bitwise_and'
- android - 如何在 Jetpack Compose 中从项目屏幕正确分发 @Previews
- magento - 如何在管理端插件的自定义模块中添加重置密码功能?
- algorithm - 如果你有一个 O(n^3) 的算法,那么你可以用一台速度快 10 倍的计算机同时处理多少个元素?
- c - 声明计数器时比较 uint8_t 与 uint16_t
- c - 创建一个使用 srand 和 rand 生成随机数的函数
- javascript - 复制链接时如何添加事件和更改?