温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy 代理怎么测试

发布时间:2026-10-09 15:38:19 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

在 Java 中,**Proxy(代理)**通常有两种常见含义:

  1. JDK 动态代理(java.lang.reflect.Proxy)
  2. CGLIB / ByteBuddy 等第三方代理
  3. 有时也指 HTTP / 网络代理(Proxy)

下面我分别说明 如何测试 Java 代理(尤其是动态代理),并给出示例。


一、测试 JDK 动态代理

1️⃣ 定义接口

public interface UserService {
    String getName(int id);
}

2️⃣ 实现类

public class UserServiceImpl implements UserService {
    @Override
    public String getName(int id) {
        return "User-" + id;
    }
}

3️⃣ 编写 InvocationHandler

import java.lang.reflect.*;

public class LogHandler implements InvocationHandler {

    private final Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("after");
        return result;
    }
}

4️⃣ 创建代理对象

UserService proxy = (UserService) Proxy.newProxyInstance(
        UserService.class.getClassLoader(),
        new Class[]{UserService.class},
        new LogHandler(new UserServiceImpl())
);

二、如何“测试”代理是否生效 ✅

✅ 单元测试(JUnit 5 示例)

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class ProxyTest {

    @Test
    void testProxy() {
        UserService proxy = (UserService) Proxy.newProxyInstance(
                UserService.class.getClassLoader(),
                new Class[]{UserService.class},
                new LogHandler(new UserServiceImpl())
        );

        String result = proxy.getName(1);

        assertEquals("User-1", result);
    }
}

✅ 验证代理类型

System.out.println(proxy instanceof Proxy); // true
System.out.println(Proxy.isProxyClass(proxy.getClass())); // true

三、测试代理中的“增强逻辑”

如果代理里有日志、事务、权限等逻辑:

@Test
void testProxyLogic() {
    UserServiceImpl target = new UserServiceImpl();
    LogHandler handler = new LogHandler(target);

    UserService proxy = (UserService) Proxy.newProxyInstance(
            UserService.class.getClassLoader(),
            new Class[]{UserService.class},
            handler
    );

    proxy.getName(2);
    // 可结合 Mockito 或捕获 System.out 来验证日志
}

✅ 更专业做法:

  • 用 Mockito.spy()
  • 使用 ByteArrayOutputStream 捕获日志
  • 或使用 SLF4J + Logback 测试 appender

四、CGLIB 代理测试(补充)

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("before");
    return proxy.invokeSuper(obj, args);
});

UserServiceImpl proxy = (UserServiceImpl) enhancer.create();

测试方式与 JDK 代理类似。


五、如果你说的是「网络 Proxy」

例如 HTTP 代理:

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8080");

测试方式:

  • 用 curl / postman
  • 或用 Java 发 HTTP 请求验证是否走代理

六、总结

代理类型 测试重点
JDK 动态代理 是否增强方法、返回值是否正确
CGLIB 是否拦截方法
网络 Proxy 请求是否经过代理

如果你能提供:

  • 是 动态代理还是网络代理
  • 用的是 JDK / Spring AOP / MyBatis / RPC

我可以给你更精准的测试方案(甚至 Mock + 断言示例)。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手