spring单元测试如何插入记录(无删除方法)

2024-01-25

我有使用 Spring 的 DAOjdbcTemplate具有创建读取更新(无删除)操作。

Create 方法有 ID 参数,它是表中的唯一键。

除了模拟 DAO 之外,我如何在不违反约束的情况下实际测试创建?

使用随机 ID 有时仍然会失败

我应该覆盖 setAutoCommit 以避免添加记录吗?它仍然被认为是有效的单元测试吗?

我必须事先在 SQL 中删除数据库中的记录吗?或者是否有针对此类测试的 spring 选项?

或者我应该将其视为集成测试而不是单元测试?

EDIT

我正在使用 Oracle,无法使用序列为 ID 创建值

我们在生产中存在一些数据源(不用于测试)


这实际上取决于此类测试的目的是什么,并非所有测试都是这方面的“单元测试”。

例如,如果目标是测试封装业务逻辑的“服务”,但从该服务中,有时会调用 DAO,那么最好的方法可能就是按照您的建议模拟 DAO。 在这种情况下,DAO 显然不会被该测试覆盖,但服务会被覆盖。

如果目的是测试 SQL 语句(并且我假设 DAO 只包含 SQL 语句+可能将它们转换为域对象),那么模拟不是一个选择。

在这种情况下,测试应该包括对某种数据库的调用,但在这种情况下,它不再被称为单元测试(单元测试是运行非常快并且仅在内存中运行的东西,没有数据库,没有 I/O,等)我将其称为集成测试(正如您也建议的那样),但是不同的人对此类测试可能有不同的名称。

在实践中,我们需要两种测试,因为它们测试不同的东西

那么,如何测试呢?

首先应该决定使用哪个数据库,这里有3种方法:

  1. 使用真实数据库运行,在用户之间共享,测试假设其已预先安装
  2. 使用内存数据库运行
  3. 测试套件运行时运行数据库的DB docker镜像,然后销毁它

虽然关于哪种方法更好的讨论本身就非常有趣,但在我看来,这超出了这个问题的范围,但每种选择都有其含义。

完成此决定后,您应该决定如何从代码中使用此数据库。

通常弹簧测试使用以下模式:

  1. 测试前打开交易
  2. 运行测试(更改数据,甚至更改架构 - 如果需要,添加列、表)。做断言
  3. 无论测试结果如何,回滚事务,使数据与测试前一样

因此,如果您对所有测试都遵循这种方法,它们将从“空”数据状态开始,这样就不会违反约束条件 这也有效地解决了“删除记录”的问题,因为当事务回滚时数据无论如何都会被删除。

现在关于事务外记录的删除。

一个明显的方法是直接从测试中(在DAO之外)执行删除的sql,这样DAO(生产代码不会被更改)

您可以将 DataSource/JDBCTemplate 直接注入到测试中(Spring 测试完美支持这一点)并从那里调用所需的 SQL

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

spring单元测试如何插入记录(无删除方法) 的相关文章

随机推荐

  • 在 bin 文件夹之外的 ASP.NET 项目中解析程序集

    我怎么能够解析程序集引用在 ASP NET Web 开发服务器的 bin 文件夹之外 这对于没有相同 dll 的副本很有用 什么都不起作用 探测 web config 中的元素 http msdn microsoft com en us l
  • Grep 输出添加额外的破折号和换行符

    我在 mac 上使用 bash 来运行一些 grep 并且使用随 macports 安装的 GNU grep 无论如何 我正在尝试使用 grep 查询 fasta 文件 DNA 序列 序列 ID 在一行上 DNA 序列在下一行 以根据要查询
  • IOS 如何使用 nsscanner 类查找完整的 rss feed 链接

    我正在致力于从基于 RSS feed 的项目中获取数据 通过在 google 上搜索 我发现通常在 HTML 源中以这种格式找到 RSS 链接 所以 我必须使用 nsscanner 类从 HTML 源中查找 RSS feed 的链接 但我不
  • 如何使用 google 地图 api v3 旋转地图方向

    非常简短的问题 因为我在谷歌地图 api V3 文档中找不到答案 我正在寻找一个控件 它允许我控制 修改 api 地图的方向 以便北不在顶部 这可能吗 如果是这样 怎么办 Thanks 你可以这样做45度虚数 https developer
  • 在 Maven 中创建 zip,并在 jar 旁边添加其他文件

    我唯一的 Maven 经验是包含其他库 因此我需要一个非常基本的解释来说明如何使用 Eclipse 在 Maven 中实现某些功能 我想定期创建我的罐子 然后我想再获取 3 个文件 并将所有文件放在 1 个 zip 文件中 我的 zip 内
  • 如何传递对 aframe 组件的引用?

    我正在编写一个自定义 aframe 组件来渲染基于很长的对象数组的网格 Aframe 文档仅将数组列为输入类型 您可以在其中传递属性 它将被解析为数组attributename 1 2 3 我想从外部将 JavaScript 引用传递到组件
  • 相当于WPF中的InvokeRequired

    WPF 中是否有与 Form InvokeRequired 等效的函数 例如调度程序 InvokeRequired 这有点奇怪 因为它没有出现在智能感知中 但您可以使用 var dispatcher myDispatcherObject D
  • 当 GPS(或定位服务)启动/停止时接收通知(通过 BroadcastReceiver)

    我尝试了一种使用 BroadcastReceiver 来侦听的方法提供商 已更改 http developer android com reference android location LocationManager html PROV
  • 如何从 WCF 服务返回干净的 JSON?

    我正在尝试从 WCF 服务返回一些 JSON 该服务只是从我的数据库返回一些内容 我可以拿到数据 但是 我担心 JSON 的格式 目前 返回的 JSON 格式如下 d Age 35 FirstName Peyton LastName Man
  • 估算 scikit-learn 中的分类缺失值

    我有一些带有文本类型列的熊猫数据 这些文本列中还有一些 NaN 值 我想做的是将那些 NaN 归咎于sklearn preprocessing Imputer 用最常见的值替换 NaN 问题出在执行上 假设有一个包含 30 列的 Panda
  • Django ImproperlyConfigured:无法加载 WSGI 应用程序“myproject.wsgi.application”;导入模块时出错

    我几乎全新安装了 django 当我运行时python manage py runserver 它给了我这个错误 配置不正确 无法加载 WSGI 应用程序 myproject wsgi application 导入模块时出错 设置 py W
  • 如何转发带有可变参数的函数?

    在 Swift 中 如何将数组转换为元组 出现这个问题是因为我试图在一个采用可变数量参数的函数内部调用一个采用可变数量参数的函数 Function 1 func sumOf numbers Int gt Int var sum 0 for
  • 检查重复项时的最佳自连接技术

    我正在尝试优化生产中的查询 该查询需要很长时间 目标是根据匹配字段值条件查找重复记录 然后将其删除 当前查询通过 t1 col1 t2 col1 上的内部联接使用自联接 然后使用 where 子句来检查值 select from table
  • 为什么异步端点的过滤器链被调用两次

    我正在开发一个基于 Spring boot 的应用程序 我注意到 对于异步端点 身份验证过滤器被调用两次 对于常规端点 它被调用一次 没找到原因 不过在网上发现了一个问题https jira spring io browse SPR 126
  • 我要释放多少次已分配或保留的对象?

    我正在制作一款 iPhone 游戏 我想释放所有已分配或保留的对象 在里面dealloc我正在释放所有此类对象 但后来我意识到有时我最终会在对象尚未分配时释放它们 所以我想我需要检查一下是否retainCount在我释放它之前是否大于零 我
  • 在Fragment中使用观察者

    在片段中使用观察者时遇到问题 我已经实现了自己的 TextViewObserver 并且我不想将其插入片段中 public class TextViewObserver extends TextView implements Observe
  • 有什么方法可以处理和返回领域驱动设计实体和聚合根中的错误(非异常和异常)?

    我正在尝试找到一篇好文章 示例 说明 DDD 实体如何处理错误 以及什么会被视为异常错误 什么不会 以及它们如何将它们传递到调用应用程序层 通常将操作包装在事务中 则需要回滚 目前 我正在考虑将所有会破坏聚合事务 例如验证 的错误视为异常
  • PHP $_POST 不起作用? [复制]

    这个问题在这里已经有答案了 我有最简单的形式 我想做的就是回显文本框中写入的内容 HTML
  • 默认初始化(带值初始化)参数包

    我可以默认将参数包初始化为每种类型各自的值初始化吗 为了更详细地说明一下 以一个简单的函数模板为例 template
  • spring单元测试如何插入记录(无删除方法)

    我有使用 Spring 的 DAOjdbcTemplate具有创建读取更新 无删除 操作 Create 方法有 ID 参数 它是表中的唯一键 除了模拟 DAO 之外 我如何在不违反约束的情况下实际测试创建 使用随机 ID 有时仍然会失败 我