`
yjhexy
  • 浏览: 331135 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

jmockit------mock

 
阅读更多

刚进公司,写两个星期的单元测试。公司主要用Jmockit ,感觉用起来还不错,于是乎,把一些写单测的时候,常遇到的写法写了下来。

 

凡是单元测试,都需要做以下几件事情

1, 明确要测试的类,和方法

2, 明确测试的实现,需要哪些依赖

3, 针对这些外部依赖 进行 mock

4, 验证是否根据自己的输入取得自己的输出

 

那么在JMOCKIT中。

做到1 这点,使用@Tested这个 注解

做到2这点,使用@injected 这个注解

做到3这点,可以使用 Expectations 和 NonStrictExpectations

做到4这点,则可以使用junit 的Assert 或者 Verifications

 

那么常见的写法就贴个出来:

 

 

 

@Tested
	@Mocked(methods = "updateEditNum")
	private CustomerServiceImpl		customerServiceImpl;

	@Injectable
	private CustomerDao				customerDao;
	@Injectable
	private CustOptionalDao			custOptionalDao;
	@Injectable
	private CustAccountInfoDao		custAccountInfoDao;
	@Injectable
	private CustContactPhoneDao		custContactPhoneDao;
	@Injectable
	private CustContactDao			custContactDao;
	@Injectable
	private CustRecipDao			custRecipDao;
	@Injectable
	private CustAutoAuditInfoDao	custAutoAuditInfoDao;
 

	// 需要修改monogo数据
	@Test
	public void testUpdateCustomer_need_update_monogo() {

		CustomerVO customerVO = buildCustomer();
		nonstrictExpectations();
		customerServiceImpl.updateCustomer(customerVO);

		new Verifications() {
			{
				mongoUpdateService.modSaleData(anyLong, anyString);
				times = 1;
				mongoCoreWordFacade.modCoreWordData(anyLong, anyString, anyLong);
				times = 1;
			}

		};
	}
private void nonstrictExpectations() {
		new NonStrictExpectations() {
			{
				customerServiceImpl.updateEditNum((CustomerVO) any, (Map<String, Short>) any);
				result = null;

				customerDao.findById(anyLong);
				Customer customer = new Customer();
				customer.setFullName("unit test fullname change");
				customer.setStat1(StatMachineService.STAT1_IN_FOLLOWING_04);
				result = customer;
				custContactDao.saveOrUpdate((CustContact) any);
				CustContact c = new CustContact();
				c.setContactId(11l);
				result = c;
				custContactPhoneDao.saveOrUpdate((CustContactPhone) any);
				CustContactPhone p = new CustContactPhone();
				p.setPhoneId(22l);
				result = p;
			}
		};
	}

 

最常用的有了,但单元测试可不是那么简单。我这边碰到第一个情景是,测试一个service.doXXX() 。

但这个 doXXX()其实里面就调用了2个private方法,那么其实问题就转变成分别测试这两个private 方法:

 

主要使用的是:Deencapsulation

 

// 测试私有方法获取该类型的para数据字典 (不传 单位岗位ID)
	@Test
	public void testFindByTypeAndPosIdWithCache_NO_POS() {

		new NonStrictExpectations() {
			{
				paraDao.findByTypeAndPosid(ParaTypeEnum.auditAbandReason);
				List<Para> pararet = new ArrayList<Para>();
				Para p = new Para();
				p.setDelFlag((short) 0);
				p.setShare((short) 0);
				p.setName("这个客户不是火星来的么,所以不能审核通过的!");
				pararet.add(p);
				returns(pararet);
			}
		};

		List<Para> rets = Deencapsulation.invoke(paramServiceImpl, "findByTypeAndPosIdWithCache",
				ParaTypeEnum.auditAbandReason, new Long[] {});
		Assert.assertTrue(rets.get(0).getName().equals("这个客户不是火星来的么,所以不能审核通过的!"));

		new Verifications() {
			{
				calloutMemcachedClient.get(anyString);
				times = 1;
				calloutMemcachedClient.set(anyString, anyInt, anyString);
				times = 1;
			}
		};
	}
 

但是查看源码 发现 继承于 Invocations的 Expectations 和 Verifications 也都是有invoke 的反射方法已经提供好了。

 

 

第二种情况来了,我要测试的@Tested 类,里面本身也有需要mock 的方法,但只 mock 其中一个方法就够了

 

 

        @Tested
	@Mocked(methods = "updateEditNum")
	private CustomerServiceImpl		customerServiceImpl;
 

第三种情况来了,有个实现的地方需要mock ,但这个实现是这样的 A.doAA().doBB().doCC()

 

 

难道要先mock A.doAA(),然后在mock这个返回值的doBB() 。。。。 太麻烦了

 

来看下:

// 测试用户信息比较全,并且需要优先审核,会更新优先统计数
	@Test
	public void testAddCustomer(@Cascading final ServiceLocator ServiceLocator) {
		long custId = 38888888l;
		CustomerVO vo = new CustomerVO();
		vo.setFullName("单元测试用户");
		vo.setCustId(custId);
。。。。。
new NonStrictExpectations() {
			{
				ServiceLocator.getInstance().getBean("saleSetFacade");
				saleSetFacade = new SaleSetFacade() {

					public SaleSet findSaleSetById(Long id) {
						return null;
					}
。。。。。。
				};
				result = saleSetFacade;
			}
		};
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    test.jmockit-0.998.jar包

    单元测试 mock jmockit包 JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API

    jmockit-1.7.jar

    jmockit-1.7.jar JMockit最新工具包

    test.jmockit-0.998-sources.jar

    单元测试 mock jmockit源码 JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API

    jmockit-1.2

    3. **录制与回放(Record and Replay)**:在测试中,JMockit先记录下mock对象的行为,然后在后续的测试中按照这些记录进行回放。这简化了测试代码的编写,避免了手动设置每个调用的细节。 4. **无侵入性(Non-...

    JMOCKIT mock 静态方法 单元测试

    可以用来Mock JAVA代码中的静态方法

    利用PowerMock模拟静态方法和私有方法的示例

    PowerMock允许我们使用`@PrepareForTest`注解指定需要模拟的类,并通过`PowerMockito.mockStatic`或`Mockito.when`来模拟私有方法。 下面是一段使用PowerMock模拟静态方法和私有方法的示例代码: ```java import ...

    JMockit教程.pdf

    开源社区有许多优秀的Java单元测试框架,JMockit是其中之一。...mock-up API用来进行stub测试。接下来分别进行介绍。这篇文章内容部分来源于JMockit Tutorial英文版的翻译,部分来源于我的一些实践与理解。

    JMockit学习分享

    本文将深入探讨JMockit这一强大的mock框架,它不仅支持模拟私有成员、静态方法,还能自动化地完成mock对象的创建与注入等工作。通过一系列具体示例和概念解析,帮助读者全面掌握JMockit的核心功能及其实现细节。 ##...

    JMockit基础教程

    5. **Mock本地方法(Native)**:虽然Java的本地方法(使用`native`关键字定义)通常不用于单元测试,但JMockit也支持对其进行模拟。 在录制期望时,你可以指定方法的参数、返回值以及期望的调用次数。例如,你可以...

    jmockit中文教程

    JMockit的核心能力在于其能够模拟(Mock)和伪装(Stub)Java类中的方法,从而使得开发者能够在隔离环境中测试代码,无需依赖于实际的系统组件。 #### 开发人员测试和测试独立 软件开发过程中,编写高质量的测试...

    此资源包含4种mock源码

    本资源包含了四个不同模拟框架的源码:Easymock、JMockit、Mockito和PowerMock,这些都是Java语言中广受欢迎的单元测试工具。下面将对这四个框架进行详细介绍。 1. **Easymock**: Easymock是一个简单的模拟框架,...

    jmockit测试例子

    Mockup always comes to us when we try to ... Now, jmockit comes to us. "Tests can easily be written that will mock final classes, static methods, constructors, and so on. There are no limitations.

    Step By Step写测试(书签版).pdf

    - **使用mock的场景**:说明哪些情况下更适合使用JMockit进行mock。 - **运行JMockit测试**:演示如何运行使用了JMockit的测试。 - **基于状态的JMockit测试**: - **方法一:使用@MockClass和 @...

    Jmockit用法示例

    **Jmockit详解:单元测试中的模拟神器** Jmockit是一款强大的Java库,主要用于单元测试,尤其是模拟(mocking)和验证(verifying)对象的行为。它提供了灵活且易于使用的API,使得测试复杂的代码变得更加简单,...

    jmockit框架所使用jar包

    jmockit框架所使用jar包,在写单元测试的过程中我们会发现需要测试的类有很多依赖,这些依赖的类或者资源又会有依赖,导致在单元测试代码里无法完成构建,我们应对的方法是Mock。简单的说就是模拟这些需要构建的类...

    mock&mysql;问题

    1. **数据库模拟**:我们可以使用mocking框架(如Mockito、JMockit等)来创建一个模拟的数据库连接,该连接返回预定义的数据集,模拟真实的查询结果。 2. **验证查询**:通过mocking,我们可以检查我们的代码是否...

Global site tag (gtag.js) - Google Analytics