假设我有一个旧版 JUnit 测试套件,其中包含以下测试:
public class AwesomeTest {
public void testBusinessLogic() {
...
[awesome mocking library]
...
}
}
public class AmazingTest {
public void testBusinessProcess() {
...
[amazing xml operation]
...
}
}
现在假设 Awesome Mocking 库依赖于 Awesome BCEL 字节码生成库,其中包含该类org.useful.XMLClass
该库具有 XMLClass 的版本 1。
现在假设 Amazing Xml 操作依赖于包含该类的 Amazing Xml 库org.useful.XMLClass
这个库有 XML 类的版本 2。
还假设该类的版本 2 不向后兼容版本 1 - 因此哪个版本在类路径中具有更高的优先级 - 它会破坏其他版本的依赖关系。
还假设有 400 个测试依赖于很棒的模拟库 - 所以重写不是一个理想的选择。
还假设一些关键业务功能是使用令人惊叹的 xml 库构建的 - 强烈建议不要重写它。
除了使用两个不同的手动排序的类路径和手动确定的测试子集运行两次 ant 测试(假设您使用 Ant 运行它们)之外,您如何解决这种类路径地狱情况? (我对自定义类加载器的想法持开放态度 - 但这似乎与具有 ant 解决方案的双自定义类路径具有相同水平的可维护性)
我确实相信使用 java 代理和自定义类加载器可以实现相当透明的解决方案。这个想法如下:
- Use the 仪器框架 http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html(java代理)在类加载时拦截它们。当您检测到 Awesome Mocking Library 中的类时,请将所有引用替换为
org.useful.XMLClass
例如,intercepted.org.useful.XMLClass
.
- 创建一个自定义类加载器,在其中检查请求的类是否是
intercepted.org.useful.XMLClass
。如果是,则加载版本XMLClass
由模拟库使用。所有其他请求都可以默认处理。
使用自定义类加载器并在运行测试时附加 java 代理,一切都应该正确运行,就好像没有依赖项冲突一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)