Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:解决名称空间冲突_Java - Fatal编程技术网

Java:解决名称空间冲突

Java:解决名称空间冲突,java,Java,我们有一个jar,我们丢失了源代码。我反编译了jar并从中创建了新的源代码。然后我想验证源代码和旧jar是否具有相同的行为。我正在编写单元测试来进行验证。问题是它们都有相同的名称空间/类名,所以我不知道如何消除旧jar和新源代码之间的歧义。我能做什么,还是不可能?一次只需在类路径上有一个版本,即可确保运行该版本的代码。将单元测试与代码分开开发,这样您就可以访问任何一个版本。为新的源代码提供一个临时名称空间,以便进行测试。然后,您可以将新类引用为,而不是导入: com.yourfirm.test.

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

一次只需在类路径上有一个版本,即可确保运行该版本的代码。将单元测试与代码分开开发,这样您就可以访问任何一个版本。

为新的源代码提供一个临时名称空间,以便进行测试。然后,您可以将新类引用为,而不是导入:

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,一次通过类文件集)。

测试需要自动生成代码,所以这是不可能的。我希望我不必这样做,但这似乎是唯一的解决办法。