java - 在单元测试中反射(reflection)以检查代码覆盖率

标签 java testing jakarta-ee tdd junit

这是场景。我有 VO(值对象)或 DTO 对象,它们只是数据的容器。当我把它们分开并保存到一个数据库中时(由于很多原因)没有优雅地映射到 VO,我想测试一下是否每个字段都在数据库中成功创建并成功读回重建 VO。

有没有一种方法可以测试我的测试是否涵盖了 VO 中的每个字段?作为解决方案的一部分,我有一个关于使用反射遍历 VO 字段的想法,但也许你们以前解决过这个问题?

当我在 VO 中添加字段时,我希望此测试失败,并且不记得在我的测​​试中为其添加检查。

开发环境: 使用 JUnit、Hibernate/Spring 和 Eclipse

最佳答案

保持简单:为每个 VO/DTO 编写一个测试:

  1. 用测试数据填充 VO/DTO
  2. 保存
  3. (可选:使用纯 JDBC 检查所有内容是否已正确保存在数据库级别)
  4. 载入
  5. 检查加载的VO/DTO和原来的匹配

生产代码会不断发展,测试也需要维护。使测试尽可能简单,即使它们是重复的,也是恕我直言的最佳方法。 过度设计测试或测试框架本身使测试通用(例如,通过反射读取字段并自动填充 VO/DTO)会导致几个问题:

  1. 花在编写测试上的时间更多
  2. bug可能是自己在测试中引入的
  3. 测试的维护更难,因为它们更复杂
  4. 测试更难发展,例如通用代码可能不适用于新的 VO/DTO 类型,它们与其他类型略有不同,稍后将介绍(这只是一个示例)
  5. 不能轻易使用测试作为生产代码如何工作的示例

测试代码和生产代码在本质上非常不同。在生产代码中,您会尽量避免重复并最大限度地重用。生产代码可能很复杂,因为它经过了测试。另一方面,你应该尝试让测试尽可能简单,重复是可以的。如果重复的部分被破坏,测试无论如何都会失败。

当生产性代码发生变化时,这可能需要对多个测试进行微不足道的更改。问题是测试被视为乏味 代码段。但我认为他们应该这样。

如果我答错了你的问题,请告诉我。

关于java - 在单元测试中反射(reflection)以检查代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874296/

相关文章:

java - 从接收者通知线程

spring - 使用 spring xml 作为后台进程/线程启动 jetty

android - 如何对蓝牙配件进行单元测试?

java - java 中 tiff 图像的平铺?或 libTiff 的 java 包装器?

jakarta-ee - 部署 Java Web 应用程序时出现问题

java - 在java中实现以Object作为参数的方法

JavaSerializer - 序列化对象时出错 -> wicket

java - Jetty 调用 ServletContextListener.contextInitialized() 后会发生什么

java.lang.OutOfMemoryError : Java heap space. 尝试将扫描仪输入值添加到 ArrayList

laravel - 在 Laravel 中测试多授权