gpt4 book ai didi

java - 如何测试 ClassFileTransformer/javaagent?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:15:04 25 4
gpt4 key购买 nike

我使用 ASM 为 javaagent 实现了一个 ClassFileTransformer。因为它有一些bug,我想为它写一个JUnit测试用例。我该怎么做?

使用我认为的伪代码:

// Have a test class as subject
public static class Subject {
public void doSomething(){...}
}
// Manually load and transform the subject
...?
// Normally execute some now transformed methods of the subject
new Subject().doSomething();
// Check the result of the call (i.e. whether the correct attached methods were called)
Assert.assertTrue(MyClassFileTransformer.wasCalled());

现在的问题是:如何手动加载和转换主题并使 JVM/Classloader 使用我的操作版本?还是我完全错过了什么?

最佳答案

我明白了。需要实现一个自己的 ClassLoader,它对测试对象执行与 ClassFileTransformer 相同的转换(例如调用它)。当然,主题类可能尚未加载,因此可能无法直接使用它。所以我使用Java反射API来执行主题类的方法。

在单独的文件中:

public static class Subject {
public void doSomething(){...}
}

在测试中:

private static class TransformingClassLoader extends ClassLoader {

private final String className;

public TransformingClassLoader(String className) {
super();
this.className = className;
}

@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.equals(className)) {
byte[] byteBuffer = instrumentByteCode(fullyQualifiedSubjectClass);
return defineClass(className, byteBuffer, 0, byteBuffer.length);
}
return super.loadClass(name);
}
}

@Test
public void testSubject(){
ClassLoader classLoader = new TransformingClassLoader(fullyQualifiedSubjectClass);
Class<?> subjectClass = classLoader.loadClass(fullyQualifiedSubjectClass);
Constructor<?> constructor = subjectClass.getConstructor();
Object subject = constructor.newInstance();
Method doSomething = subjectClass.getMethod("doSomething");
doSomething.invoke(subject);
Assert.assertTrue(MyClassFileTransformer.wasCalled());
}

关于java - 如何测试 ClassFileTransformer/javaagent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6586681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com