spring boot单元测试mock代理接口--反射机制

2019-12-02  本文已影响0人  wuli见见

场景:

在类中注入DAO接口,如Mapper,实际是一个代理接口,单元测试的时候模拟SQL语句返回结果。

上一篇文章使用Setter方法改变代理接口为Mock类

但是会对代码有所改变,侵入性太强,不合理,所以此次使用反射机制来改变类的属性

/**

* 改变目标类的属性

* @param candidate    目标类

* @param fieldName    属性名

* @param fieldObject  属性类

*/

public void changeTargetField(Object candidate, String fieldName, Object fieldObject) {

    if (candidate instanceof Advised) {

        TargetSource targetSource =((Advised) candidate).getTargetSource();

        if (targetSource instanceof SingletonTargetSource) {

            Object target = ((SingletonTargetSource) targetSource).getTarget();

            try {

                Field field = candidate.getClass().getSuperclass().getDeclaredField(fieldName);

                field.setAccessible(true);

                field.set(target, fieldObject);

                return;

            } catch (NoSuchFieldException | IllegalAccessException e) {

                throw new RuntimeException("代理类设置属性失败");

            }

        }

        throw new RuntimeException("未找到代理类");

      } else {

          try {

                Field field = candidate.getClass().getDeclaredField(fieldName);

                field.setAccessible(true);

                field.set(candidate, fieldObject);

          } catch (NoSuchFieldException | IllegalAccessException e) {

                throw new RuntimeException("目标类设置属性失败");

          }

    }

}

上一篇 下一篇

猜你喜欢

热点阅读