领域驱动单元测试详解

数据访问的单元测试

搜索了一下“数据访问层如何做单元测试?”,还真的有很多广大社区网友的心得。

JAVA的数据访问层其实可以写单元测试,但测完之后就不会有变化。

因为数据访问层本就不允许包含业务逻辑,写一个测一个删一个,留着没有意义,正儿八经留着还会增加额外工作量。

1、编写测试用例,包含了初始化测试环境的数据,测试目标代码,最后清空数据。

这种方法看似很规范,其实初始化测试环境的数据时都有可能报错,你写的时候测试是通过了,但你无法控制其他成员不操作数据库导致环境发生改变,一段时间后回过头再运行单元测试不一定能通过。

2、H2内存数据库单元测试。

比上面多了一步创建一段脚本建表。独立于测试环境的内存数据库,不用担心环境被改变。

但存在数据库脚本同步的问题,表结构调整要随时更新脚本。

3、Hibernate工具映射生成数据库。

比上面好一点,解决了同步问题,以领域模型为主,而不以数据库表结构为主。

但是必须是Hibernate,还得切换配置文件数据连接字符串,没切完蛋了。

最佳的实践是:数据库有变化,就测试相关的DAL,测试完就删除/注释用例和测试产生的数据。

因为我们的DAL里并不会包含业务逻辑,任何业务逻辑,只关心几张表之间自己的事情,只要表结构不动,就没必要重新测。

难点就是不包含任何业务逻辑。

举个例子:

SELECT * FROM [TABLE] WHERE STATE=1

这段SQL语句里其实就包含了一定业务,STATE=1。

DAL其实需要明白STATE=1是什么意思,如果化解?如下

SELECT * FROM [TABLE] WHERE STATE=:STATE

让STATE=1是什么意思让上面的业务层去解释。

业务逻辑的单元测试

要求业务逻辑层能独立运行,不允许依赖数据访问层。

许多人一开始就理解错误了,以为三层架构是WEB引用BUSINESS引用DAL,这是误传。

其实三层架构只是大致分为WEB / BUSINESS / DAL三层,相对于桌面应用程序两层架构 CLIENT/SERVER 来说的。

实际操作过程中,会用到依赖反转让DAL依赖BUSINESS,BUSINESS只依赖数据访问接口。

BUSINESS只能包含业务逻辑,不能去依赖其他层了,不然难以TDD DDD。

原理明白了,我们单元测试还是跑不起来,因为运行时会告诉我们数据访问接口没有实现。

这里最佳的实践是:用MOCK模拟数据访问接口实现,定义入参和返回值,单独测试业务逻辑。

mockito
@Mock
    SsoTokenRepository ssoTokenRepository;

    @Mock
    SsoSessionRepository ssoSessionRepository;

    @InjectMocks
    AuthorizedService authorizedService;

    @Test
    public void getAccessToken() throws Exception {
        //定义返回值
        SsoToken result= new SsoToken();
        result.setToken("123");
        //定义入参
        final String accessToken="444";

        when(ssoTokenRepository.get(anyString())).thenReturn(result);//模拟一个仓储伪类

        SsoToken ssoToken = authorizedService.getAccessToken(accessToken);

        verify(ssoTokenRepository).get(accessToken);//验证模拟的伪类有没有被执行到

        assertEquals(result.getToken(),ssoToken.getToken());
        System.out.println(result.getToken());
    }

这样在项目的任何阶段都可以重现单元测试,并且可以作为CMMI评审的测试用例。

原文地址:https://www.cnblogs.com/13yan/p/9158895.html

时间: 2024-10-26 07:58:49

领域驱动单元测试详解的相关文章

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

MTK平台LCD驱动框架详解(一)

许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

MTK平台LCD驱动框架详解(二)

前篇博客链接:http://blog.csdn.net/xuan_h/article/details/38519975 上篇博文说到了mtkfb_probe函数,本文在说mtkfb_probe函数之前.我还是打算在从应用程序的调用开始分析下具体的调用过程.这是我们理解驱动框架的核心,而并不是简单的接受. 一.驱动核心Fbmem.c(alps\kernel\drivers\video\Fbmem.c)分析 下面先摘取一部分源码,源码包括:入口函数.fb_fops.fb_fops中的open函数.用

《Linux设备驱动开发详解(第3版)》进展同步更新

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2014.6.30 目前初步完成4-9章,相对于第2版,这几章主要的变更. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第4章 <Linux内核模块>[F]改正关于模块使用非GPL license的问题:[F]修正关于__exit修饰函数的内存管理 第5章 <Linux文件系统与设备文件>[F]修正关于文件系统与块设备驱动关系图:[N]增加应用到驱动的file操作调用图:[N]增加通过ne

【转】Linux下Android ADB驱动安装详解

原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比较多,本人使用的Ubuntu系统好多厂商的Android手机都无法正确的识别,经过一番折腾,和查阅SDK,现把Linux下ADB驱动配置的方法和当中会遇到的相关问题的解决方法整理出来贡献给大家. Linux下使用手机USB调试模式连接ADB进行Android程序的调试,配置驱动没有Windows来的

《Linux设备驱动开发详解(基于最新4.0内核)》前言

Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的傻劲. 这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进.浮躁.内心的不安宁使我们极难静下心来研究什么.我见过许许多多的Linux工程师,他们的简历书写着"精通"Linux内核,有多年的工作经验,而他们的"精通"却只是把某个寄存器从0改成1,从1改成0的不

linux 字符设备驱动开发详解

一.设备的分类及特点 1.字符设备 字符设备是面向数据流的设备,没有请求缓冲区,对设备的存取只能按顺序按字节的存取而不能随机访问.    Linux下的大多设备都是字符设备.应用程序是通过字符设备节点来访问字符设备的.通常至少需要实现 open, close, read, 和 write 等系统调用.    设备节点一般都由mknod命令都创建在/dev目录下,包含了设备的类型.主/次设备号以及设备的访问权限控制等,如:crw-rw----  1 root  root 4, 64 Feb 18