Java:解决命名空间冲突

时间:2011-03-08 20:20:58

标签: java

我们有一个jar,我们丢失了源代码。我反编译了jar并从中创建了新的源代码。我想验证源代码和旧jar有相同的行为。我正在编写单元测试来进行验证,问题是它们都有相同的命名空间/类名,所以我不知道如何消除旧jar和新源代码的歧义。我能做什么或不可能做什么?

6 个答案:

答案 0 :(得分:3)

您需要同时在类路径上只有一个版本,以保证您运行的是该版本的代码。与代码分开开发单元测试,以便您可以使用任何一个版本。

答案 1 :(得分:1)

为测试目的提供一个临时命名空间。然后,您可以将新课程称为:

,而不是导入
com.yourfirm.test.packagename.TheClassName

旧的可以简单地导入并称为TheClassName。通过这种方式,您可以通过查看哪些测试用例来判断。

或者只需使用-cp oldpackage.jar然后-cp newpackage.jar运行测试。

答案 2 :(得分:1)

这是可能的,但你必须搞乱类加载。您不需要将任何一个jar放在类路径上,而是需要在运行时加载它们。查看JCL以获取库,以便您执行此操作。 (免责声明:我从未使用过JCL。)

基本上,每个测试都必须从旧的JAR加载类,获取您正在测试的方法的结果,然后卸载该JAR,加载新的JAR,对新版本运行相同的方法,以及比较结果。

答案 3 :(得分:0)

我将使用类路径更改运行时正在测试的类。在确保您针对两个二进制文件运行相同的测试代码方面,这种方法不易出错。否则,您会在测试是否正确时引入更多复杂性。

答案 4 :(得分:0)

听起来你正试图同时对两个罐子执行测试。如果它们都在类路径中,我不知道如何消除旧/新罐的歧义。

如果您的单元测试输出结果为stdout / stderr,您可以对原始jar运行测试并保存结果。然后针对新jar运行测试并将结果保存在单独的文件中。然后区分文件。

另一种方法是重构新的源代码,使其具有唯一的命名空间。然后你可以同时测试两个罐子,但是现有程序使用新罐子可能需要做很多工作。

答案 5 :(得分:0)

如果你通过ant(Junit-task)运行你的测试,你可以分别控制两个运行的ant类路径(一次通过jar,一次通过类的文件集)。