Java:解决名称空间冲突
我们有一个jar,我们丢失了源代码。我反编译了jar并从中创建了新的源代码。然后我想验证源代码和旧jar是否具有相同的行为。我正在编写单元测试来进行验证。问题是它们都有相同的名称空间/类名,所以我不知道如何消除旧jar和新源代码之间的歧义。我能做什么,还是不可能?一次只需在类路径上有一个版本,即可确保运行该版本的代码。将单元测试与代码分开开发,这样您就可以访问任何一个版本。为新的源代码提供一个临时名称空间,以便进行测试。然后,您可以将新类引用为,而不是导入:Java:解决名称空间冲突,java,Java,我们有一个jar,我们丢失了源代码。我反编译了jar并从中创建了新的源代码。然后我想验证源代码和旧jar是否具有相同的行为。我正在编写单元测试来进行验证。问题是它们都有相同的名称空间/类名,所以我不知道如何消除旧jar和新源代码之间的歧义。我能做什么,还是不可能?一次只需在类路径上有一个版本,即可确保运行该版本的代码。将单元测试与代码分开开发,这样您就可以访问任何一个版本。为新的源代码提供一个临时名称空间,以便进行测试。然后,您可以将新类引用为,而不是导入: com.yourfirm.test.
com.yourfirm.test.packagename.TheClassName
旧的可以简单地导入并称为classname
。通过这种方式,您可以通过查看您的测试用例来判断
或者只需使用
-cp oldpackage.jar
运行测试,然后使用-cp newpackage.jar
我将使用类路径更改运行时测试的类。在确保对两个二进制文件运行相同的测试代码方面,这种方法不太容易出错。否则,您将在测试是否正确的问题上引入更多的复杂性。听起来您似乎试图同时对两个JAR执行测试。如果新旧jar都在类路径中,我不知道如何消除它们之间的歧义
如果单元测试将结果输出到stdout/stderr,则可以对原始jar运行测试并保存结果。然后对新jar运行测试,并将结果保存在单独的文件中。然后区分文件
另一种方法是重构新的源代码,使其具有唯一的命名空间。然后,您可以同时对两个jar进行测试,但要使现有程序使用新的jar可能需要大量工作。这是可能的,但您必须处理类加载。您需要在运行时加载它们,而不是将任何一个JAR放在类路径上。签出一个库以允许您执行此操作。(免责声明:我从未使用过JCL。)
基本上,每个测试都必须从旧JAR加载类,获取您正在测试的方法的结果,然后卸载该JAR,加载新JAR,对新版本运行相同的方法,并比较结果。如果您通过ant(Junit任务)运行测试,您可以分别为两次运行控制ant类路径(一次通过jar,一次通过类文件集)。测试需要自动生成代码,所以这是不可能的。我希望我不必这样做,但这似乎是唯一的解决办法。