当前位置: 首页 > 面试题库 >

春季如何在单元测试中插入记录(没有删除方法)

洪飞白
2023-03-14
问题内容

我的DAO使用Spring的jdbcTemplateCreate Read Update(no Delete)操作。

创建方法具有ID参数,该参数是表中的唯一键。

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

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

我应该重写setAutoCommit以避免添加记录吗?仍然考虑有效的单元测试吗?

我必须事先在SQL中删除数据库中的记录,还是这种类型的测试有spring选项?

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

编辑

我使用的是Oracle,无法使用序列创建ID的值

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


问题答案:

这实际上取决于这种测试的目的是什么,就这一点而言,并非所有测试都是“单元测试”。

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

如果目的是测试SQL语句(并且我假设DAO除了SQL语句+可能将它们转换为域对象,则不包含任何内容),则不能选择模拟。

在这种情况下,测试应该包括对某种数据库的调用,但是在这种情况下,它不再称为单元测试(单元测试是一种运行速度非常快的东西,它仅在内存中,没有DB,没有I /
O,等)(我也将其称为集成测试),但是对于这种测试,不同的人可能会有不同的名字。

实际上,我们需要两种测试,因为它们测试的是不同的东西

那么,如何测试呢?

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

  1. 在用户之间共享的真实数据库上运行,测试假定其已预先安装
  2. 使用内存html" target="_blank">数据库运行
  3. 测试套件运行时运行数据库的DB docker映像,然后销毁它

尽管关于哪种方法更好的讨论本身非常有趣,但对于IMO这个问题而言,却超出了讨论范围,每个选择都有其含义。

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

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

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

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

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

一种明显的方法是直接在测试中(在DAO外部)执行删除的sql,以便DAO(不会更改生产代码)

您可以将DataSource / JDBCTemplate直接注入测试中(Spring测试完全支持此操作),然后从那里调用所需的SQL



 类似资料:
  • 问题内容: 我有一个maven spring项目(最新版本),我想编写一些junit测试(最新版本)。 我的问题是我的Spring bean是自动装配的,当我从junit test调用它们时,我得到了空指针异常,因为spring不能自动装配它们。 如何加载上下文,以便自动连线? 问题答案: 您是否学习过Spring参考文档中的“ 测试”一章?这是您应该从以下示例开始的示例: 如果您进入,则需要-但

  • 问题内容: 我有一个Spring / Hibernate网络应用程序,该应用程序具有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用了这个空白数据库并创建了我的所有测试表和约束。但是,我有一个新的bean,在它的afterPropertiesSet()方法期间检查数据库中的特定配置值,因此,当初始化此bean时,该行需要存在于数据库中。 有

  • 我在应用程序中使用Log4JV2.0Beta3进行日志记录,并且在运行单元测试时生成日志消息。我检查了API以确定将日志级别设置为关键级别的方法,但我找不到任何方法来更改日志程序配置。 事实上,我是在log4j2网站上读到的:

  • 我有一个方法调用另一个方法来检索数据并将其插入数据库,既然这个方法什么也不检索,我如何在Junit中测试这个方法呢?有人能给我提供一些这种情况的例子吗? 我想为用户使用mock对象,但我不确定如何检查用户是否插入到数据库中。请帮帮忙。

  • 问题内容: 我想使用SpringContextTests测试我的Dao类。 在我的方法类中,我扩展了,以便我的测试类与JUnit4集成。我还设置了配置,并在和的DownDown中进行了初始化和数据库清理。我的测试课效果很好。 我的问题是,当我运行测试类并且数据库中充满了数据时,原始数据没有回滚并且数据库被清除了。在该方法中,我清除数据库并填充数据,以为我可以回滚数据库,但不能回滚。 任何人都可以找

  • 问题内容: 我有一个Java应用程序,它从主类开始(不是Spring Boot应用程序)。而且我想使用Spring retry在连接丢失时重试。据我所知,我需要在Spring应用程序的主类之上添加@EnableRetry批注,然后在我的方法之上使用@Retryable进行重试。但是我认为这在非​​Spring应用程序中将不起作用。是否可以在简单的Java应用程序(而非spring应用程序)中使用s