私有属性注入

使用场景实例代码:

@Service
public class UserServiceImpl implements UserService {
 
    @Autowired
    private UserDao userDao;
    
    @Override
    public void save(User user){
        ......
        userDao.insert(user);
    }
	......    
}

解决方案:

public class UserServiceTest {
    private UserService userService;
	@Before
    public void setUp() throws Exception {
    	userService = new UserServiceImpl();
        UserDao userDao = mock(UserDao.class);
  		ReflectionUtils.setFieldValue(userService,"userDao",userDao);
    }   
    @Test
    public void testSave(){
        userService.save(null);
    }
        

工具类:

/**
  * @description: 反射工具类
  * @author zhu
  */
public class ReflectionUtils {
    /**
     * 设置属性值
     * @param obj
     * @param fieldName
     * @param value
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static void setFieldValue(Object obj, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Class<?> clazz = obj.getClass();
        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }

    /**
     * 访问私有方法
     * @param obj
     * @param funcName
     * @param parameterTypes
     * @param args
     * @return
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static Object invoke(Object obj, String funcName, Class<?>[] parameterTypes, Object... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<?> clazz = obj.getClass();
        Method insideMethod = clazz.getDeclaredMethod(funcName, parameterTypes);
        insideMethod.setAccessible(true);      
        Object value = insideMethod.invoke(obj, args);
        return value;
    }
}
原文地址:https://www.cnblogs.com/markLogZhu/p/11717669.html