java 存根

每个具有数据库的项目都有两难选择:如何测试与数据库有关的代码。 有几种选择(不互斥):

  • 使用模拟–假设DAO与数据库之间的通信有效,请仅使用单元测试并模拟数据访问层
  • 使用每个测试启动和关闭的嵌入式数据库。 这也可以视为单元测试
  • 使用部署在某个地方(本地或测试环境)的真实数据库。 困难的部分是确保它始终处于干净状态。
  • 在将应用程序部署到具有适当数据库的测试服务器上之后,请使用端到端/功能测试/ bdd / UI测试。

以上都不是没有问题。 具有模拟DAO的单元测试无法真正测试依赖于数据库状态的更复杂的交互。 嵌入式数据库并不总是可用的(例如,如果您使用的是非关系数据库,或者如果您依赖RDBMS特定的功能,则HSQLDB不会这样做),否则它们的启动速度可能会很慢,因此您的测试可能会花费很长时间支持。 实际的数据库安装会使设置复杂化,保持其清洁并非总是那么容易。 端到端测试的覆盖范围很难衡量,并且不一定涵盖所有边缘情况,因为它们比单元测试和集成测试更难维护。

我最近尝试了一种奇怪的方法,该方法到目前为止效果很好–对数据库进行存根 。 它更适用于键值存储,而不适用于关系数据库。

就我而言,即使有嵌入的cassandra ,启动起来也很慢,安装起来并不容易,并且存在一些细微的问题。 这就是为什么我用内存中的ConcurrentHashMap替换了整个内容。

由于我使用的是spring-data-cassandra,因此我扩展了CassandraTemplate类,并在新的StubCassandraTemplate实现了所有方法,并在测试spring上下文中使用了它而不是常规方法。 存根可以很轻松地支持所有键/值操作,并且您可以进行更复杂的集成测试(当然,拥有非常复杂的测试不是一个好主意,但是单元测试可能太简单或太依赖于一个很多模拟)。 以下是代码摘录:

@Component("cassandraTemplate")
public class StubCassandraTemplate extends CassandraTemplate {private Map<Class<?>, Map<Object, Object>> data = new ConcurrentHashMap<>();@Overridepublic void afterPropertiesSet() {// no validation}@SuppressWarnings("unchecked")@Overridepublic <T> T insert(T entity) {List<Field> pk = FieldUtils.getFieldsListWithAnnotation(entity.getClass(), PrimaryKey.class);initializeClass(entity.getClass());try {pk.get(0).setAccessible(true);return (T) data.get(entity.getClass()).put(pk.get(0).get(entity), entity);} catch (IllegalAccessException e) {throw new IllegalArgumentException(e);}}private <T> void initializeClass(Class<?> clazz) {if (data.get(clazz) == null) {data.put(clazz, new ConcurrentHashMap<>());}}
....
}

Cassandra支持诸如CQL(查询语言)之类的一些高级功能,它不像诸如get和put这样的键值操作那么容易存根,但实际上并不难。 尤其是如果您不依赖复杂的where子句(无论如何在Cassandra中都是不好的做法),都可以使用regex轻松解析查询并在ConcurrentHashMap找到合适的条目。

键值存储是此方法的理想选择,因为在集成测试方案中不需要其主要优点(易于水平扩展)。 您只需要验证代码是否正确处理了与数据库的交互,包括放置在数据库中的内容和返回的内容。 这种交互的确切实现方式-无论是在内存中还是使用二进制协议,都可能超出范围。

请注意,这些测试不能保证应用程序将与真实数据库一起使用。 他们仅保证如果数据库的行为与内存中的键值数据结构相同,则它将正常运行。 通常这是假设,但并不总是正确的-例如,数据库可以施加存根实现所没有的其他约束。 例如,Cassandra不允许对非索引列进行WHERE查询。 如果您不考虑这一点,很显然,您的测试将通过,但是您的应用程序将被破坏。

这就是为什么您仍然需要端到端测试以及可能需要一些真正的集成测试的原因,但是您可以使用一个简单的内存存根覆盖大多数代码,而仅执行一些“合理的”完全集成测试。

翻译自: https://www.javacodegeeks.com/2017/08/stubbing-key-value-stores.html

java 存根

java 存根_存根键值存储相关推荐

  1. fastjson查找指定键值_分布式键值存储 etcd

    引言 前面的文章中,介绍了基于Paxos的ZooKeeper,本文将介绍另一种分布式一致性算法Raft的工业级实现----etcd,它们虽然实现方案不同,但是最终的实现效果都很像,而且etcd相较于Z ...

  2. java做一个简单的数据库,哪个嵌入式数据库用Java写成一个简单的键/值存储?

    我最近问了一个关于Neo4j的问题,我有工作,似乎很好.它是可嵌入的,它是用Java编写的,没有(太)许多依赖. 然而,它是一个图形数据库,我不知道这是一个好主意或不使用它作为一个简单的键/值存储. ...

  3. plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019

    『看看论文』是一系列分析计算机和软件工程领域论文的文章,我们在这个系列的每一篇文章中都会阅读一篇来自 OSDI.SOSP 等顶会中的论文,这里不会事无巨细地介绍所有的细节,而是会筛选论文中的关键内容, ...

  4. java游戏修改文件_教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏

    教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏 作者:admin教程来源:百科原创点击数:6688 更新时间:2009-6-4 JavaMagic是一款为解决手机Java游戏某些兼容性 ...

  5. 分布式键值存储ETCD

    分布式键值存储 前言 实现分布式系统的目标以及挑战 分布式ETCD存储 etcd介绍 基于etcd的使用场景 1.键值对存储 2.服务注册与发现 3.消息发布与订阅 4.分布式锁 etcd相关术语(关 ...

  6. 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据

    五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...

  7. Dynamo:亚马逊的高可用键值存储

    目录 1. 简介 2. 背景 3. 相关工作 4. 系统结构 5. 实现 6. 经验和教训 7. 结论 Dynamo:亚马逊的高可用键值存储 摘要:大规模的可靠性是我们在 Amazon.com 面临的 ...

  8. redis nosql_Redis教程:NoSQL键值存储

    redis nosql 课程大纲 Redis是使用ANSI C编写的,具有可选持久性的开源,网络化,内存中键值数据存储.根据DB-Engines.com的月度排名,Redis是最受欢迎的键值存储. 其 ...

  9. Redis教程:NoSQL键值存储

    课程大纲 Redis是使用ANSI C编写的具有可选持久性的开源,网络化,内存中键值数据存储.根据DB-Engines.com的月度排名,Redis是最受欢迎的键值存储. 它的名字意思是远程字典服务器 ...

  10. 五大存储模型关系模型 键值存储 文档存储 列式存储 图形数据库

    也可以认为是五大数据库存储模型. 数据库市场需要细分,行式数据库不再满足所有的需求,而有很多需求需要通过本内存数据库和列式数据库解决,列式数据库在数据分析.海量存储.BI这三个领域有自己独到. 1. ...

最新文章

  1. 基于OpenCV实战:3步实现图像降噪
  2. Science长文综述:通过空间斑图形成避免复杂系统崩溃
  3. Apache防止DDOS***的模块--mod_evasive
  4. STM32 进阶教程 19 - IQmath数学库的使用
  5. SQL server连接到服务器,无法连接到 (local)。在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Se
  6. linux decode函数,Oracle 中 decode 函数用法
  7. zend server 配置问题 ZendEnablerConf.xml
  8. 【最小生成树】路线规划(nowcoder 217603)
  9. CSS未知宽高元素水平垂直居中
  10. 浮点数的运算精度丢失
  11. pyqt5与html数据交互原理,pyqt5与本地html进行js交互
  12. ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)
  13. Windows 环境下adb.exe无法启动的解决办法之一
  14. 互联时代如何真正支持与实现数据经济
  15. python多线程怎么样_python如何使用多线程?
  16. 测试用例设计方法——等价类划分法
  17. OpenCV各个版本的下载地址
  18. 列线图计算每个患者得分,并生成Roc曲线。
  19. clamav获取病毒库版本号
  20. rdlc打印时多出空白页面(reportviewer).导出多出空白页(pdf,word)

热门文章

  1. 基于virtualbox 的虚拟路由器搭建
  2. python 二项分布
  3. 以大数据架构电商2.0的新时代
  4. (转)Pod 2g简谈越狱的意义
  5. 使用selenium爬取百合网
  6. 认识CleanMyMac 3破解版的危害
  7. CleanMyMac4.11.1中文完整语言版本
  8. INT32_MIN溢出
  9. erlang之ets总结
  10. 《互联网时代》第五集 崛起