【问题标题】:Byte Buddy is creating +1 TRANSFORM after every test class executionByte Buddy 在每次测试类执行后创建 +1 TRANSFORM
【发布时间】:2021-12-29 07:56:43
【问题描述】:

我正在使用 Micronaut 3.0 和 Byte Buddy 1.12.6,Groovy 进行测试。

当我在 IntelliJ 中一次运行整个测试包时会出现问题(不必是整个包,1 个以上的测试类就足够了)。

随着每个测试类的执行,它为代理匹配的每个类创建 +1 变换。

执行的第一个测试类:

[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]

执行的第二个测试类:

[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]
[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]

执行的第三个测试类:

[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]
[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]
[Byte Buddy] TRANSFORM com.class [jdk.internal.loader.ClassLoaders$AppClassLoader@5ffd2b27, unnamed module @87a85e1, Thread[Test worker,5,main], loaded=true]

等等

示例测试类

@MicronautTest(transactional = false, environments = "db")
@Stepwise
@Slf4j
class TestClass with Specification {

    def "test method"() {
    .....
    }

}

我的代理类:

@Context
public class LoggingAgent {

    @PostConstruct
    private void premain() {
        new AgentBuilder.Default()
                .disableClassFormatChanges()
                .with(AgentBuilder.Listener.StreamWriting.toSystemError().withTransformationsOnly())
                .with(AgentBuilder.InstallationListener.StreamWriting.toSystemError())
                .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
                .type(isSubTypeOf(Test.class).and(not(isAbstract())))
                .transform((builder, typeDescription, classLoader, module) -> builder.visit(Advice.to(LoggingAdvice.class).on(isMethod())))
                .installOn(ByteBuddyAgent.install());
    }

}

建议

public class LoggingAdvice {

    @Advice.OnMethodEnter
    public static void intercept(@Advice.Origin Method method, @Advice.AllArguments Object[] args) throws Exception {
    .....
    }
}

【问题讨论】:

    标签: java micronaut byte-buddy


    【解决方案1】:

    我假设代理安装了多次,可能每次测试一次。您可以取消注册甚至重置已安装的代理,返回的 ResettableClassFileTransformer 为此提供了方法。或者,检查旅游代理是否已在当前 VM 上处于活动状态并避免重新注册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多