`

复杂业务逻辑下的单元测试

 
阅读更多

    你有木有遇到过这种情况,在为一个复杂业务方法写单个单元测试时,你需要做一大堆初始化工作,主要是各种service,你也可以直接把总个容器初始化(如果你使用spring等容器的话),如果项目比较大,运行单个测试,得等上几十秒,你hold住吗,可以参照我的方法进行加速(http://mingliang-luo.iteye.com/blog/1258830);

    现在就复杂业务方法写单元测试给出一个解决方案:我采用的是【 继承 + easyMock 】,也可以使用【easyMock class + easyMock】;

    一个复杂业务方法内,会调用此类中很多的方法,而你的测试又与之无关,这时,你可以使用继承,直接重写那个方法,那么,这个方法内的初始化工作就不需要做了,当然,你也可以使用【easyMock class】重写;

    但如果不是调用此类的方法,而是调用其它service中的方法,那你可以直接使用easyMock代替真实的service;

    采用这种方式后,你就可以快速编写这种复杂业务逻辑的测试了,并且它可以运行得很快。

    下面是我的一个测试,仅供参考:

	static MemberService memberService; //需要测试的方法
	static SqlSession sqlSession;
	
	@BeforeClass
	public static void beforeClass() throws Exception{
		sqlSession = SessionFactory.getSqlSession(); 
		MemberServiceImpl memberServiceImpl = new MemberServiceImpl();
		MemberDao memberDao = new MemberDao();
		memberDao.setMemberMapper((MemberMapper)SessionFactory.getMapper(MemberMapper.class, sqlSession));
		memberServiceImpl.setMemberDao(memberDao);
		memberService = memberServiceImpl;
		
		ReturnFreeToCustomerByFirstRefundOrChangeTest re = new ReturnFreeToCustomerByFirstRefundOrChangeTest();
		re.setMemberService(memberServiceImpl);
		changOrRefundService = re;
	}
	//第一次退换货,返运费,15元
	@Test
	public void testReturnFreeToCustomer1th() throws Exception{
		ChangOrRefundAssistant cra = new ChangOrRefundAssistant();
		cra.setOrderCd("110927001086NT");
		cra.setRefundType(NoneyReturnedConstants.REFUNDTYPE_TH);
		
		Order order = new Order();
		order.setOrderCd(cra.getOrderCd());
		order.setMemberId(239l);
		
		Float account = memberService.queryAccountBalanceByMemberId(order.getMemberId());
		//无关的service
		OrderCCService orderCCService = createMock(OrderCCService.class);
		orderCCService.returnedInventory(EasyMock.<String>anyObject(), EasyMock.<List<OrderItem>>anyObject());
		expect(orderCCService.genOrderLog(EasyMock.<PublicLog>anyObject())).andReturn(1);
		expect(orderCCService.loadOrdertByCd(EasyMock.<String>anyObject())).andReturn(order);
		replay(orderCCService);
		changOrRefundService.setOrderCCService(orderCCService);
		
		//退货
		changOrRefundService.refundByWarehouseRMI(cra);
		
		sqlSession.clearCache();
		Float accountAfter = memberService.queryAccountBalanceByMemberId(order.getMemberId());
		
		//[帐户增加15元]
		assertEquals(15, accountAfter - account, 0.001);
		
		List<AccountLog> logs = memberService.queryAccountLogs(order.getMemberId());
		AccountLog lastLog = logs.get(0);
		//[存入]  [15元]  [退换货返运费,订单为xxxxxx]
		assertEquals(Constants.MBS_ACCOUNT_TRADE_TYPE_1, lastLog.getTradeType());
		assertEquals(15, lastLog.getAmount(), 0.001);
		assertTrue(lastLog.getNote().startsWith("退换货返运费"));
		assertTrue(lastLog.getNote().contains(order.getOrderCd()));
	}//下面的全是refundByWarehouseRM会调用的方法,不关心,直接pass
	public ChangOrRefund  queryChgOrRefdByOrderId(Long orderId) throws Exception{
		return new ChangOrRefund();
	}
	public List<ChangOrRefundDetail> loadChangOrRefundDetailByChgId(Long id)throws Exception {
		return new ArrayList<ChangOrRefundDetail>();
	}
	public List<OrderItem> genOrderItemByRefund(List<ChangOrRefundDetail> lstDetails,Long orderId)throws Exception{
		return null;
	}
	public void updateOrderItemByWhouse(Long orderItemID,String refundType) throws Exception{
		
	}
	public void deductInventoryByChange(String channelCode,List<ChangOrRefundDetail> lstChgItem) throws Exception{
		
	}
	public void updateOrderByWH(ChangOrRefundAssistant changOrRefundAssistant,Order order) throws Exception{

	}
分享到:
评论

相关推荐

    业务逻辑业务逻辑业务逻辑业务逻辑

    业务逻辑设计总结 业务逻辑是指在软件系统中对...业务逻辑设计是一个复杂的过程,需要考虑到多个方面的因素。通过对业务逻辑设计的分析,我们可以更好地理解业务流程的自动化、简化和优化,以提高业务效率和降低成本。

    单元测试

    《spring测试.rar》可能是一个包含更多Spring框架下单元测试示例的资源包,其中可能涵盖Spring MVC、Spring Data JPA等模块的测试方法。 总的来说,单元测试是保障软件质量的重要手段,它需要结合合适的测试框架、...

    基于 React 的企业管理系统开发经验,带你学习如何抽象复杂业务逻辑,帮助团队实现效能提升.pdf

    ### 基于React的企业管理系统开发经验:抽象复杂业务逻辑以提升团队效能 #### 前言 在当今数字化转型的时代背景下,企业管理系统扮演着至关重要的角色。它们不仅需要高效地处理日常运营中的大量数据,还要能灵活...

    单元测试规范详细说明

    4. **业务过程类方法/Dwr后台类方法**:这些类方法通常涉及业务逻辑的核心部分,可能包括与用户界面交互的部分。对于这类方法,单元测试不仅要关注其功能实现,还要考虑异常处理的情况。 5. **外部系统交易类方法/...

    SpringBoot 多模块 Serivce 层单元测试

    Service层是业务逻辑的核心,对其进行单元测试是确保代码质量、提高开发效率的重要步骤。本文将深入探讨如何在IDEA中对Spring多模块项目中的Service层进行单元测试。 首先,我们需要理解Spring Boot的多模块架构。...

    Junit 单元测试完整案例

    4. 测试Action类:通过模拟Service层的依赖,直接测试Action类的execute()方法,确保业务逻辑的正确性。 四、测试实践 在案例中,你将看到如何创建测试类,定义测试方法,设置测试数据,以及如何利用JUnit和Spring...

    测试项目在数据库单元测试中的应用

    6. 维护和更新:随着业务逻辑的修改,定期更新测试用例和测试代码,以确保测试覆盖最新的功能和需求。 数据库单元测试不仅能够帮助发现代码中的错误,还能在开发早期就提供反馈,从而减少后期维护的成本。通过持续...

    junit单元测试jar包集

    它的目的是简化测试代码,让开发者更专注于业务逻辑的验证,而不是测试基础设施。 **Mockito** 是一个流行的模拟框架,`mockito-1.9.5.zip`是它的1.9.5版本。在单元测试中,模拟对象可以帮助我们隔离被测试代码,...

    对WinForm进行单元测试的例子(使用NUnitForms)

    至于`ClassLibrary1`,它可能包含了WinForm应用程序所依赖的服务或者业务逻辑。这些类库同样需要进行单元测试,但通常会使用标准的NUnit库,而不是NUnitForms。可以为每个类或方法编写单独的测试,确保它们的功能...

    086集-实现业务逻辑层

    7. **单元测试**:为了确保业务逻辑的正确性,单元测试是必不可少的。视频可能会讲解如何编写针对BLL的测试用例,使用Mockito等工具模拟依赖。 8. **代码重构**:良好的业务逻辑层设计应遵循单一职责原则,确保每个...

    软件测试技术 测试基本概念和单元测试

    ### 软件测试技术:测试基本概念与单元测试 #### 一、软件测试的背景与意义 **软件测试的背景:** 随着信息技术的发展,软件系统变得越来越庞大且复杂,软件质量的问题日益突出。一方面,软件缺陷的存在几乎是不可...

    EJB容器内单元测试指南

    2. **模拟对象**:由于EJB通常与数据库、远程接口等有紧密交互,为了进行单元测试,我们需要使用Mock对象来替代这些依赖,以便专注于测试EJB的业务逻辑。 3. **事务管理**:EJB操作通常在事务中进行,测试时需要...

    单元测试之道(C#版中文版)

    此外,对于复杂业务逻辑和多线程场景下的单元测试,书中也会给出具体策略和最佳实践。 在进行单元测试时,代码覆盖率也是衡量测试完整性的一个重要指标。书中会讲解如何计算和理解代码覆盖率,以及如何合理设定覆盖...

    对私有方法进行单元测试

    然而,如果私有方法承担了复杂的业务逻辑,那么对其进行单元测试是必要的。 在`TestCaseHelperTest.java`中,我们可以看到一个示例测试类,它可能是用于测试`TestCaseHelper`的各个方法,包括可能的私有方法测试...

    什么是三层架构_表现层/业务逻辑层/数据访问层

    BLL的目的是将复杂的业务逻辑与用户界面和数据存储分离,以实现更高的灵活性。 数据访问层(DAL)专注于与数据库的交互,负责数据的增、删、改、查操作。DAL提供了一组接口或类,使得上层的BLL可以无需关心具体的...

    单元测试教程

    - **业务逻辑复杂性:** 复杂的业务逻辑处理。 - **需求变更频繁处:** 经常变化的需求所对应的代码部分。 **1.6 不测试的内容** - **构造函数:** 通常不在单元测试中直接测试构造函数。 - **setter()、getter()方法:...

    界面业务逻辑

    5. **可测试性**:良好的业务逻辑设计应该允许单元测试和集成测试,以验证其功能和性能。 6. **性能优化**:考虑到UI的实时性,UI引擎需要进行性能优化,如减少不必要的计算,缓存重复使用的数据,以及有效地更新...

    07. Spring Boot单元测试

    在Service层,我们通常需要测试业务逻辑而不涉及数据库操作。这时,可以使用`@Autowired`注入MockBean来模拟Repository或其他依赖,确保测试的隔离性。 六、Data访问层测试 对于Repository或DAO层,可以使用`@...

Global site tag (gtag.js) - Google Analytics