- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 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/
我使用 ASM 为 javaagent 实现了一个 ClassFileTransformer。因为它有一些bug,我想为它写一个JUnit测试用例。我该怎么做? 使用我认为的伪代码: // Have
我试图用 Javaflow(http://commons.apache.org/sandbox/commons-javaflow/)和 OW2 ASM 库(http://asm.ow2.org/)检测
实时java.lang.instrument.ClassFileTransformer的目的是什么。这仅在分析过程中使用吗? 最佳答案 javadoc API中说那: An agent provide
不同的来源提供了使用 Javassist 实现 ClassFileTransformer 的不同方法: blog.newrelic.com/2014/09/29/diving-bytecode-man
我用 premain 方法编写了一个类,在该方法中我添加了一个 ClassFileTransformer 到 Instrumentation (Instrumentation.addTransform
方法 ClassFileTransformer.transform(ClassLoader classLoader, String className, Class classBeingRedefin
我正在使用 Spring 和 AspectJ 做一些不错的编织,我在插入 后遇到了这个问题。进入我的应用程序上下文: Caused by: java.lang.IllegalStateExcepti
当我尝试将 weblogic.xml 中启用 fast-swap 模式的分解目录部署到 weblogic 10.3 时,出现以下异常 如果我删除
我是一名优秀的程序员,十分优秀!