每次在开发和测试业务逻辑biz时老是碰到这样那样似曾相识的问题,现在记一下备忘。
1、使用JPA/Hibernate/Ebean等ORM时来存取数据库时,不另外增加DAO层。理由是ORM已经封装和统一了不同数据库的基础访问、存取操作,不需要重复劳动,除非有特殊需要。
2、事务处理就是在biz层上定义的,推荐使用Spring容器来管理事务。
3、在使用事务注解时要注意@Transactional注解只能使用在public方式上才有效。放在protected/private方法上不会报错。另外只需要在要启动事务的最外层方法上加这个注解,内部方法是不需要的。
4、在对查询数据库操作,应使用只读事务,对数据加共享锁,以避免其他事务修改该数据。同时注意注解应使用这种形式:
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
使用Propagation.REQUIRED以确保事务的正常启动,如果使用propagation=Propagation.NOT_SUPPORTED则不会启动事务,readOnly属性实际上就失效了。
5、在使用Spring来管理Ebean的事务时,记得要设置<property name="defaultServer" value="true" />。否则死活不会成功。Ebean的Spring例子上好像有错。
6、在使用Spring来管理事务时,有两种生成代理方式。默认是Jdk自带的代理实现。推荐cglib方式,因为这种方式是使用的enhancer代理方式,是在原有XXXBizImpl上产生了一个增强的继承类,所以代理对象可以转换成XXXBizImpl。这样在测试时就更方便。因为我们业务接口方法肯定少于实现的方法。要测试实现上的各个方法,只有用cglib才能注入实现类。Jdk proxy只能注入接口。
要使用cglib除了增加相关依赖包,还要在spring中增加<aop:config proxy-target-class="true" />。
至于两种方式的性能,可参考http://budairenqin.iteye.com/blog/1500366,如果被测的cglib版本比较低。
7、使用unitils来对biz层进行测试,并使用dbunit来初始化测试数据。使用dbunit也会有几个问题:
使用@ExpectedDataSet注解时,会出现org.dbunit.dataset.RowOutOfBoundsException: 1 > (1)异常,但不影响结果,只需要换用新版本的dbunit就行了。出错的版本是dbunit2.2.2。
(2)在配置Spring事务后,本来测试时还正常的dataset测试文件,会报出org.dbunit.dataset.NoSuchColumnException: HIP_PERSON.BASIC_ADDR_ID - (Non-uppercase input column: BASIC_ADDR_ID) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.异常。
出错的原因是第一条测试数据有8个字段,第二条测试数据只有3个,dbnit会用第一条数据的字段去要求第二条数据的,结果就报错了。结果这不是一个bug,可以看这里http://www.dbunit.org/components.html#flatxmlDataSet,
如果要想测试通过,需要把每条记录的字段都弄成一样多,但是这样太麻烦了。unitils也一直未更新解决该问题。结果只有自己重写了MultiSchemaXmlDataSetFactory。另:可自己通过DatabaseUnitils类来生成DataSet的XSD。
(3)需要注意的@ExpectedDataSet注解只验证dataset xml文件中对应的数据。不对数据库所有的数据进行验证。
8、在使用Spring管理事务时,会碰到Service/Biz实现类因调用自身方法而导致事务错误的情况。如下:
Class ABiz{
@Resource
private bBiz;
@Transaciton
public void add(){}
public void addAll(){
this.add(); //这里因为直接调用的this.add(),所以spring代理并不启动事务
bBiz.xxx(); //这里的事务有效
}
}
所以,需要在ABiz中注入自身,通过spring代理来调用带事务的业务方法。
代码修改如下:
Class ABiz{
@Resource
private bBiz;
@Resource
private aBiz;
@Transaciton
public void add(){}
public void addAll(){
aBiz.add(); //现在,事务注解就生效了
bBiz.xxx(); //这里的事务有效
}
}
分享到:
相关推荐
本毕业设计首先对Jsp日记本系统的基本情况进行了分析,提出开发本系统要实现的功能和需要解决的问题,对系统进行了详细的需求分析。 系统的主要功能是提供用户日记的记录和管理功能。用户可以通过本系统进行日记的写作...
通过使用东集八通道开发SDK与文档,开发者可以更加专注于业务逻辑的实现,而无需花费大量时间在底层技术的研发上。这不仅提高了开发效率,也降低了开发成本。此外,SDK和文档还经过了严格的测试和优化,保证了其稳定...
从测试方法的角度可以分为手工测试和自动化测试。 手工测试:不使用任何测试工具,根据事先设计好的测试用例来运行系统,测试各功能模块。 自动化测试:利用测试工具,通过编写测试脚本和输入测试数据,自动运行测试...
该系统的功能模块分为接口层、业务逻辑层和数据访问层。接口层可以与用户通信并提供外部接口。系统通过界面层收集用户数据,用户进行注册、登录、浏览和评分。业务逻辑层可进行用户信息管理和电影信息管理;业务逻辑...
当测试脚本有成百的代码行,验证点,分支的逻辑,错误处理,参数和数据在多个已录制的业务流程之间的相关性时,调试并且解决测试脚本中的问题变得特别的乏味和难以处理。对于调试那些复杂且又冗长的测试脚本,一个...
单元测试就是模块测试,我的理解一个模块就是一个类,主要是指我们的 Service 模块,因为一个项目中大部分的业务逻辑都在 Service 层。我们专注测试 Service 中的方法即可。集成测试也就是多个模块的联合测试,...
在系统测试中,主要是对BOSS系统的业务逻辑功能,以及软交换系统的Class 5特性进行测试。性能测试中,主要是进行的压力测试,在各个不同数量请求的情况下,获取系统响应时间以及系统资源消耗情况。自动化测试主要是...
中间层框架是有助于以可重用,可扩展,可维护和可测试的方式创建业务逻辑的代码。NET和.NET Core的中间层微框架什么是中间层框架? 中间层框架是有助于以可重用,可扩展,可维护和可测试的方式创建业务逻辑的代码。 ...
1. 功能测试:用于测试软件系统的各个功能是否符合要求和预期,包括输入验证、输出验证、界面测试、数据验证、业务逻辑测试等。 2. 性能测试:用于测试软件系统在特定负载下的性能和稳定性,包括负载测试、压力测试...
业务开发存在的问题: 1、不易理解,不宜维护,不熟悉的人难以快速上手 2、改一个bug或增加一个小功能引出很多其他问题,测试难 产生问题的原因: 1、业务逻辑、流程本身就复杂,而且有很多定制的小细节 2、后端soa...
软件测试规范 目 录 一.概述 ............................................................................................................................................................ 1 二 软件...
07.Kafka Java API 简单开发测试 08.storm-kafka 详解和实战案例 09.S图表框架HighCharts介绍 10.HBase快速入门 11.基于HBase的Dao基类和实现类开发一 12.基于HBase的Dao基类和实现类开发二 13.项目1-地区销售额-...
依据PSD文件的格式信息,自动生成被测源程序的所有驱动函数,单元测试过程不再依赖开发人员手动编写测试函数,只需将生成的驱动函数和被测源文件一起编译,即可执行测试并查看测试结果。测试驱动自动生成程序基于PSD...
(2) 函数驱动自动生成模块 依据PSD文件的格式信息,自动生成被测源程序的所有驱动函数,单元测试过程不再依赖开发人员手动编写测试函数,只需将生成的驱动函数和被测源文件一起编译,即可执行测试并查看测试结果...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
6 测试结果和程序逻辑的图形表达 6. 1. 7 用户友好的界面 6. 2 Panorama自动测试软件提供的质量保障体系 6. 2. 1 软件质量保障度量 6. 2. 2 Panorama软件质量保障度量的含义 6. 2. 3 支持IEEE标准 第7章 ...
通过一个简单的命令行工具yiic可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。 Yii开发框架 v2.0.12 更新日志 测试 测试覆盖对于早期检测...
本书案例涉及行业广泛,实用性非常强,通过本书的学习,读者可以了解各个行业的特点,能够针对某一行业进行软件或网站开发,也可以通过光盘中提供的案例源代码和数据库进行二次开发,以减少开发系统所需要的时间。...
07.Kafka Java API 简单开发测试 08.storm-kafka 详解和实战案例 09.S图表框架HighCharts介绍 10.HBase快速入门 11.基于HBase的Dao基类和实现类开发一 12.基于HBase的Dao基类和实现类开发二 13.项目1-地区销售额-...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...