解决遗留 junit 测试套件中的 java 类路径地狱

2024-07-01

假设我有一个旧版 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 代理和自定义类加载器可以实现相当透明的解决方案。这个想法如下:

  1. 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.
  2. 创建一个自定义类加载器,在其中检查请求的类是否是intercepted.org.useful.XMLClass。如果是,则加载版本XMLClass由模拟库使用。所有其他请求都可以默认处理。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决遗留 junit 测试套件中的 java 类路径地狱 的相关文章

  • 使用 jsoup 收集倒计时器并为 android 设置计时器

    我想解析 eBay 上的倒计时器 span class 5g 20h span 如何用 jsoup 解析它以在 android studio 上创建倒计时器 我可以像平常一样解析它吗element 像下面这样 更新 getMsFromStr
  • Java 打印 PDF 并带有选项(装订、双面打印等)

    我有一个打印 PDF 的 java 程序 它使用 Apache PDFBox 创建PDDocument对象 来自 pdf 文档或某些情况下来自流 然后使用javax print API private boolean print File
  • 在 Maven 存储库中查找 Oracle JDBC 驱动程序

    我想将 oracle jdbc 驱动程序作为依赖项 运行时范围 添加到我的项目中 ojdbc14 在 MVNrepository 站点中 放入 POM 的依赖项是
  • 即使凭据正确,Spring-security 也不会登录用户

    谁能指出我的错误 我一开始无法使用注册用户登录 我以为是因为我正在加密密码 但即使现在我已经删除了编码 即使使用明文密码 用户仍然无法登录 这是我的 web xml
  • Java可以用来写Win32系统服务吗?

    标题有点概括了 我正在考虑使用Jabaco http www jabaco org因为它生成 EXE 以及 jar 文件 而且我对 VB 语法比对 Java 更熟悉 你当然可以用Java 服务包装器 http wrapper tanukis
  • 按下 JButton 时运行函数

    我正在尝试用java编写一个程序 使用机器人每隔几秒按一次特定的键 它有一个带有开始和停止按钮的 GUI 以及一个告诉其处于哪个状态的标签 到目前为止 我已经完成了所有工作 除了当我单击 开始 时 它运行我的机器人功能的循环 这是无限的 没
  • FlyingSaucer renderer.setDocument 抛出“流已关闭”异常

    我在使用找到的简单示例创建 PDF 时遇到问题here http today java net pub a today 2007 06 26 generating pdfs with flying saucer and itext html
  • HQL查询是否总是命中数据库并得到结果?

    我正在经历休眠以及何时使用的情况Criteria vs HQL我的理解是 使用 Hibernate 每次我们通过以下方式查询数据库时Criteria or HQL在这两种情况下 休眠都会获取结果集并放入内存中 然后当我们再次调用该查询时 将
  • Jersey/JAX-RS :在响应标头中返回内容长度而不是分块传输编码

    我正在使用 Jersey 创建 RESTful API 资源 并且ResponseBuilder生成响应 RESTful 资源的示例代码 public class infoResource GET Path service id Produ
  • 用java.nio在内存中写入文件?

    使用 nio 可以映射内存中的现有文件 但是是否可以仅在内存中创建它而不在硬盘驱动器上创建文件 我想模仿 CreateFileMapping 窗口函数 它允许您在内存中写入 Java 中有等效的系统吗 目标是写入内存以便另一个程序 c 读取
  • Android UserManager.isUserAGoat() 的正确用例?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我正在查看 中引入的新 API安卓4 2 http en wikipedia org wiki Android version
  • RMI服务器异常

    当我尝试运行使用远程注册表的服务器时 我收到以下来自 RMI 的异常 我的 Server2 类中 main 方法的注册表代码是 Registry registry LocateRegistry getRegistry 192 168 1 4
  • CodenameOne 在构建后停止工作

    我对 codenameone 有一个奇怪的问题 我什至不确定出了什么问题 我尝试过 发送 Windows Phone 版本 并且从那时起我认为我没有更改任何其他内容 然而 在我这样做之后 模拟器无法启动并一直说我的导入是错误的 事实并非如此
  • 如何在servlet应用程序中更改用户的tomcat密码?

    我们的 Web 应用程序部署在 Tomcat 上 目前使用 UserDatabaseRealm 来确保安全 我们希望在应用程序中提供一个页面 用户可以在其中更改密码 一个简单 常见的 Web 应用程序功能 我找不到任何示例 servlet
  • 在 Java 8 中使用 Lambda 将流收集到 HashMap 中

    我有一个 HashMap 我需要使用一些函数来过滤它 HashMap
  • 在 JSP 中呈现 JSON 数据的最佳实践是什么?

    我需要在 JSP 中针对某些 AJAX 请求呈现 JSON 数据 我想知道在易用性和稳定性方面最好的方法是什么 假设您想要从一个或多个 Java 对象生成 JSON 以下是一种相当简单的方法 将 Java 对象设置为请求 会话范围内的属性
  • Java:Set接口和Collection接口的区别

    我刚刚查了一下Set接口 发现它大部分 或完全 只重新声明已经存在于Collection界面 Set本身延伸Collection 所以这是否意味着Set界面自动具有所有功能Collection 那么为什么要重新声明它们呢 例如 Set重新声
  • 消息应用程序的 ListView 滚动后显示错误的 listItem 布局

    我知道stackoverflow上已经发布了很多类似的问题 所以请不要以为我没有高低搜索过 我认为我的问题只是来自于现在完全理解 listViews 和列表项的生命周期 我有一个列表视图 可以包含两种类型的消息 出站或入站 最初 我的 li
  • 在Java中设置整数的范围[重复]

    这个问题在这里已经有答案了 我有属性 private int Number 我想限制这个数字 使其只能在值 1 3 之间 当我设置值时 我会在方法中执行此操作吗 或者是否有一种预定义方式 让我只希望值 1 3 成为该整数的有效值 提前谢谢了
  • 在Java中设置整数的范围[重复]

    这个问题在这里已经有答案了 我有属性 private int Number 我想限制这个数字 使其只能在值 1 3 之间 当我设置值时 我会在方法中执行此操作吗 或者是否有一种预定义方式 让我只希望值 1 3 成为该整数的有效值 提前谢谢了

随机推荐