我必须测试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
属性的值,然后在actual实例中进行设置,这会在单元测试执行期间导致NPE。考虑到您的单元测试实际上是一个集成测试(即,涉及多个类并且显然正在测试持久性层的代码流,而不是对API的简单实现的事实,另一种方法可能是实例化您的持久性层在初始化测试单元时,但这可能会对测试的性能产生负面影响。