gpt4 book ai didi

java - 解决遗留 junit 测试套件中的 java classpath hell

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:50 27 4
gpt4 key购买 nike

假设我有一个包含以下测试的遗留 JUnit 测试套件:

public class AwesomeTest {
public void testBusinessLogic() {
...
[awesome mocking library]
...
}
}

public class AmazingTest {
public void testBusinessProcess() {
...
[amazing xml operation]
...
}
}

现在假设 Awesome Mocking 库依赖于包含类 org.useful.XMLClass 的 Awesome BCEL 字节码生成库,并且该库具有 XMLClass 的版本 1。

现在假设 Amazing Xml 操作依赖于包含类 org.useful.XMLClass 的 Amazing Xml 库,并且该库具有 XML 类的版本 2。

同时假设该类的版本 2 不向后兼容版本 1 - 因此哪个版本在类路径中具有更高的优先级 - 它打破了另一个版本的依赖关系。

还假设有 400 个测试依赖于 awesome mocking 库——所以重写不是一个理想的选择。

还假设一些关键的业务功能是用惊人的 xml 库构建的——强烈建议不要重写它。

您如何解决这种类路径 hell 情况 - 除了使用两个不同的手动排序的类路径和手动确定的测试子集运行 ant 测试(假设您正在使用 Ant 运行它们)两次之外? (我对自定义类加载器的想法持开放态度——但这似乎与带有 ant 解决方案的双自定义类路径的可维护性水平大致相同)

最佳答案

我确实相信使用 Java 代理和自定义类加载器可以实现非常透明的解决方案。思路如下:

  1. 使用Instrumentation Framework (java 代理)在加载类时拦截它们。当您检测到 Awesome Mocking 库中的类时,将所有对 org.useful.XMLClass 的引用替换为例如 intercepted.org.useful.XMLClass
  2. 创建自定义类加载器,在其中检查请求的类是否为 intercepted.org.useful.XMLClass。如果是,加载 Mocking 库使用的 XMLClass 版本。默认情况下可以处理所有其他请求。

在运行测试时使用自定义类加载器并附加 java 代理,一切都应该正确运行,就好像没有依赖冲突一样。

关于java - 解决遗留 junit 测试套件中的 java classpath hell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com