首页 > 解决方案 > 如何在 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

标签: javajunitjunit4

解决方案


根据 OP 中提供的信息,似乎UserProfileDAO类在您的测试中被实例化而没有设置tableNameResolver属性。

我建议您在单元测试中使用模拟框架,例如Mockito。您可以使用此框架提供一个模拟实例作为t​​ableNameResolver属性的值,然后将其设置在实际的实例中,这会在单元测试执行期间导致 NPE。

考虑到您的单元测试实际上是一个集成测试(即涉及多个类的代码流,并且显然正在测试持久层而不是 API 的简单实现),另一种方法可能是在测试单元的初始化,但是这会对单元测试的性能产生负面影响。


推荐阅读