【问题标题】:JUnit Test framework for Javaagent Instrumentation FrameworkJavaagent Instrumentation Framework 的 JUnit 测试框架
【发布时间】:2018-08-01 02:22:41
【问题描述】:

为 Java 代理和仪器库的代码创建单元测试的标准方法是什么。我已经使用 Byte Buddy 框架创建了一个 Java 代理,用于在 Web 应用程序之上开发分析器,现在我想为这个代理编写 JUnit 测试用例。

【问题讨论】:

    标签: java unit-testing junit byte-buddy


    【解决方案1】:

    您可以从 Byte Buddy's own unit tests 获得灵感来创建 Java 代理。为此,请声明对 byte-buddy-agent 模块的测试依赖项。该模块包括一个能够在运行时使用ByteBuddyAgent.install() 附加Java 代理的类,该类返回一个Instrumentation 实例。确保在运行单元测试后删除 Java 代理。否则,您的代理将在任何后续测试中保持活动状态。

    创建可重复测试的一个棘手部分是在应用代理之前不能加载类。 Byte Buddy 的测试工具通过创建一个ByteArrayClassLoader 来解决这个问题,该ByteArrayClassLoader 能够处理所有受检测的类。由于此类加载器是动态创建的,因此可以保证这一点。

    大多数捆绑了 JDK 的 VM 都能够在运行时附加 Java 代理。可以肯定的是,Byte Buddy 确实为 JUnit 定义了一个 AgentAttachmentRule,它在运行测试之前断言了此功能。你也可以考虑一下。

    【讨论】:

    • 您能否具体说明如何在测试中删除代理?我没有看到#uninstall 或类似内容。从 JDK 中加载类时,使用 ByteArrayClassLoader 的“技巧”是否也有效?我收到“java.lang.SecurityException:禁止的包名称:java.io”。
    • Install 返回一个可以通过检测接口移除的变压器。
    • bytebuddy 的 test-jars 是否可以在任何 maven 存储库中使用,以便我们重用您建议的工具,例如“AgentAttachmentRule”?
    • 不,它们不是,但它的 10 行代码应该很容易重新创建。 (我不想用稳定的 API 应用这么小的测试工具。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多