博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在单元测试时隔离ORM
阅读量:7112 次
发布时间:2019-06-28

本文共 1126 字,大约阅读时间需要 3 分钟。

hot3.png

在项目中需要对DAL层进行单元测试,如果直接操作数据库,首先测试速度会大大下降,而且让单元测试直接使用外部依赖,很可能带来后续维护的不便,所以有必要对数据库隔离,然后单独测试DAL层。由于使用了ORM框架EF,就从EF入手。按照单元测试的思路,这是便在DAL层与EF之间找到或制造接缝,并从接缝处开始分割、注入。

 

一 基本思路

a) 有个专门的设计模式(Repository)可以解决这个问题,这种模式除了能很好的达成我目前隔离ORM以进行单元测试的目的,还允许方便地替换ORM和数据库,比如从EF换成Dapper、从SQL Server 换成MySQL。这看来是很好的方法,但有点复杂,没有弄明白。这儿是为了达到隔离ORM框架的目的,所以就借鉴Repository模式的思路,先来个简化版的,借用别人的图描述:

 

图片来源:

 

以前在DAL中直接操作EF,两者紧密耦合。拿操作Student实体来举例,重构后将EF相关的代码都封装到IStudentRepository接口后面,这样DAL中操作的是IStudentRepository接口的方法而不再是EF了,随后便可以用实现IStudentRepository接口的桩对象来替换EF了。

 

b) 具体的实现中,规定了IRepository<T>接口,这个接口定义了基本的增删改查操作

 

 

 

如果是与后台管理员相关的逻辑,AdminUserRepository会实现这个接口,Add方法如下,在这里会直接操作EF对象(FitDbContext)。

 

 

然后在AdminUserService中,将AdminUserRepository经过构造函数传入

 

 

AdminUserRepository是对EF操作的封装,因为它实现了IRepository接口,所以可以基于IRepository接口产生伪对象,而且这样的结构还允许在AdminUserRepository中实现缓存,这样来看,叫Repository真是太形象了,上层代码可以直接从仓库中拿数据,而不必关心数据是直接从数据库拿还是上次缓存的。经过这样的改造后,便可以方便地进行单元测试了。

 

 

 

 

二 隔离后的测试案例

下面是一些使用NUnit和NSubstitute的测试代码记录

a) 验证桩对象的int型返回值

 

 

b) 测试返回的IQueryable结果集

 

为了伪造IQueryable结果集花了不少功夫,最后终于知道可以用.AsQueryable()方法。

 

c) 如果要验证返回的实体是否相等,需要重写相关的Equals方法

 

在AreEqual可以指定“相等”的标准

 

转载于:https://my.oschina.net/u/2327858/blog/912859

你可能感兴趣的文章
struts2 遇到的问题 2
查看>>
Java问答:终极父类(3)
查看>>
彻底搞定Android开发中软键盘的常见问题
查看>>
Java使用RandomAccessFile读写文件
查看>>
程序员学习能力提升三要素
查看>>
《Java8实战》笔记-1.2.2传递代码:一个例子
查看>>
不懂技术的人不要对懂技术的人说这很容易实现
查看>>
HTML5之桌面提醒
查看>>
IDEA注册机
查看>>
微信APP支付 ,App无法调起微信
查看>>
Spring boot 内嵌tomcat,临时目录不存在 错误
查看>>
fedora16中virtualbox无法启动xp虚假机
查看>>
(十五)用JAVA编写MP3解码器——音频输出
查看>>
MyClouds开发指南》第1章 MyClouds微服务治理及快速开发平台简介
查看>>
mysql 时间格式化
查看>>
用JDK制作可能运行的JAR
查看>>
eval 解析 JSON 格式数据
查看>>
hibernate笔记(六)关于懒加载和load()方法之三——误区
查看>>
消息队里-消息队列应用场景
查看>>
推荐:7 月份值得一看的 Java 技术干货!
查看>>