【发布时间】:2014-01-13 21:43:51
【问题描述】:
我的问题是我正在尝试与 jar 文件包含混淆字节码的 Java 应用程序进行互操作。该应用程序每隔一个月左右发布一次更新,当他们发布时,大多数类和方法名称都会更改。
因此,这里提出的方法:
http://rickyclarkson.blogspot.com/2006/07/duck-typing-in-java-and-no-reflection.html
或
Simulating duck typing in Java
在我的解决方案中不起作用,因为我每次都必须手动更新界面。
然而,我所拥有的是从去混淆的类名 混淆的类名自动生成的(大部分)映射,方法是解析类文件以调用调试日志记录调用,格式如下:
logger.log(severity, "ClassName", "MethodName() has some error")
我生成的是这样的:
public final static String MyRealName = "someObfuscatedName".
public final static String MyRealName_myCoolMethod = "someMethodName".
我有一个相当不错的解决方案,可以通过反射 API 与“myRealName”的对象进行交互,并且只是代理对象,这些对象实现了它所代理的对象的功能子集。有点像这样:
class MyRealName {
private Object backingObject;
public MyRealName(Object o) { backingObject = o;}
public void myCoolMethod() {
return getFieldValue(backingObject
, DeobNames.MyRealName_myCoolMethod);
}
}
但是,当我想在没有运行混淆应用程序的情况下测试我的代码时,就会出现问题 - 启动时间和设置可能需要几分钟,而我希望测试验证只需几秒钟。
我正在寻找一种可以轻松调整我的测试以适应我的代码所依赖的频繁更改的类名的方法。
我对 JMockit 等工具的强大功能很感兴趣,因为它们能够为我自动生成模拟对象,我希望能够拥有一些薄层,以便仍然拥有我的大部分模拟很容易生成,而不必手动编写所有内容,每次更新。
【问题讨论】:
-
“启动时间和设置可能需要几分钟,而我希望测试验证只需几秒钟” - 是启动如此缓慢的原始应用程序还是您的代理?
-
为什么需要启动混淆的jar?你能简单地将它导入你的类路径蚂蚁然后通过反射遍历吗?
-
@akhikhl 这是原始代理。
-
@Seagull 这就是我为互操作所做的。该应用程序有 13k 类文件,其中超过 100 个可能对我来说很有趣。我已经手动创建了具有 1:1 映射的代理类,然后我对其应用抽象以简化接口......我不想为模拟创建相同的代理集,但它看起来就像我能做的就是为鸭子打字添加一个反射层......
标签: java unit-testing groovy mocking duck-typing