持续集成之路 —— Mock对象引起的测试失败
2013-08-12 15:14
323 查看
今天遇到了一个很奇怪的问题,纠结了好久。在和同事念叨这个问题时,突然想到了问题所在。
问题现象: 在一个Service的单元测试类中有八个测试用例,单独运行时都可以正常通过。可是一旦一起运行时,总是会有固定的两个测试失败。
问题原因:有一个测试用例mock了Service依赖的一个Dao对象,之后的用例再使用这个Dao对象时,就使用了mock,而不是Spring初始化的Instance.
解决方法:在测试用例结束,重新将Spring初始化Dao对象set给Service对象,具体代码:
除了上面的方法,还可以通过设定用例的执行顺序解决上面的问题。但是这个方法还是具有一定的危险性,一定要保证使用mock对象的测试用例最后执行,并且所有使用mock对象的用例之间要安排好执行顺序。关于如何指定测试用例的执行顺序,可以参考下面的文章:
问题现象: 在一个Service的单元测试类中有八个测试用例,单独运行时都可以正常通过。可是一旦一起运行时,总是会有固定的两个测试失败。
问题原因:有一个测试用例mock了Service依赖的一个Dao对象,之后的用例再使用这个Dao对象时,就使用了mock,而不是Spring初始化的Instance.
解决方法:在测试用例结束,重新将Spring初始化Dao对象set给Service对象,具体代码:
public class ReportServiceTest { //被测试的Service,由Spring初始化 @Autowired private UserService userService; //Service依赖的Dao,由Spring初始化 @Autowired private UserDao userDao; @Test @DatabaseSetup("dataset.xml") //测试数据集 public void testGetManager(){ //创建mock对象 UserDao mockUserDao = mock(UserDao.class); //设置mock的Dao要模拟的操作 when(...).thenReturn(..); //替换依赖 ((UserServiceImpl)userService).setUserDao(mockUserDao); //具体测试代码 …… //将mock的dao替换掉 ((UserServiceImpl)userService).setUserDao(userDao); } }
除了上面的方法,还可以通过设定用例的执行顺序解决上面的问题。但是这个方法还是具有一定的危险性,一定要保证使用mock对象的测试用例最后执行,并且所有使用mock对象的用例之间要安排好执行顺序。关于如何指定测试用例的执行顺序,可以参考下面的文章:
Understanding JUnit method order execution JUnit test method ordering Ordered testcases execution in junit 4
相关文章推荐
- 持续集成之路 —— Mock对象引起的测试失败
- 持续集成之③:将代码自动部署至测试环境
- 基于jenkins持续集成测试的意义
- 如何使用Jenkins进行持续集成测试
- 解析DataWorks数据集成中测试连通性失败问题
- [原创]浅谈持续集成在测试中的应用
- 持续集成之路——数据访问层单元测试遇到的问题
- 持续集成测试(3) -- kubernetes环境搭建
- Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署
- 项目的大小衡量标准,项目架构的方法(填空架子,持续集成,边开发边测试效果)(装贴)
- 读书-持续集成-为缺陷编写测试
- 持续集成 自动化构建、测试、部署您的Coding代码
- jenkins+ant+jmeter搭建持续集成的接口测试平台
- Jenkins持续集成测试之Android单元测试
- Spring Test, JUnit, Mockito, Hamcrest 集成 Web 测试
- 测试:mock对象
- 持续集成之路——搭建Maven私服
- 持续集成-Jenkins+robot framework+Appium实现在单台电脑上管理不同安卓终端运行不同测试用例
- 持续集成之路——Maven
- UI层自动化测试框架(六):持续集成和测试报告