0 0

用easymock怎样测试该方法10

待测方法:
public void moveDataToHistroyTable(Integer docId) throws IllegalAccessException, InvocationTargetException {
		DocDocument document = documentDao.get(docId);
		DocDocumentHst documentHst = new DocDocumentHst();
		BeanUtils.copyProperties(documentHst, document);
		documentHst.setDocDocumentHstId(document.getDocDocumentId());
		documentHst.setCommonDocEmergency(document.getCommonDocEmergency());
		documentHst.setCommonDocSecret(document.getCommonDocSecret());
		documentHst.setCommonDoctype(document.getCommonDoctype());
		documentHst.setDocSecrettimeUnit(document.getDocSecrettimeUnit());
		documentHst.setDocSpecialReturnreceiptType(document.getDocSpecialReturnreceiptType());
		documentHstDao.save(documentHst);
	}


测试方法:
@Test
	public void moveDataToHistroyTable() throws IllegalAccessException,
			InvocationTargetException {
		CommonDoctype commonDoctype = new CommonDoctype();
		commonDoctype.setDoctypeId(1);
		commonDoctype.setDoctypeCode("docType");

		CommonUnit unit = new CommonUnit();
		unit.setUnitId(1);
		unit.setUnitCode("4409131234");

		CommonUnit unit2 = new CommonUnit();
		unit.setUnitId(1);
		unit.setUnitCode("4409131244");

		DocDocument document = new DocDocument();
		document.setDocDocumentId(1);
		document.setDocCode("1111-ITDCL");
		document.setDocTitle("test");
		document.setCommonDoctype(commonDoctype);

		DocSend send = new DocSend();
		send.setDocSendId(1);
		send.setDocDocument(document);
		document.getDocSends().add(send);

		DocSendUnit sendUnit = new DocSendUnit();
		sendUnit.setCommonUnit(unit);
		sendUnit.setDocIsreceived(1);

		DocSendUnit sendUnit2 = new DocSendUnit();
		sendUnit.setCommonUnit(unit2);
		sendUnit.setDocIsreceived(1);

		send.getDocSendUnits().add(sendUnit);
		send.getDocSendUnits().add(sendUnit2);
		
		EasyMock.expect(mockDocumentDao.get(1)).andReturn(document);
		EasyMock.replay(mockDocumentDao);
		
		DocDocumentHst docHst = new DocDocumentHst();
		BeanUtils.copyProperties(docHst,document);
		docHst.setDocDocumentHstId(document.getDocDocumentId());
		docHst.setCommonDocEmergency(document.getCommonDocEmergency());
		docHst.setCommonDocSecret(document.getCommonDocSecret());
		docHst.setCommonDoctype(document.getCommonDoctype());
		docHst.setDocSecrettimeUnit(document.getDocSecrettimeUnit());
		docHst.setDocSpecialReturnreceiptType(document.getDocSpecialReturnreceiptType());
		mockDocumentHstDao.save(docHst);
		EasyMock.expectLastCall(); 
		EasyMock.replay(mockDocumentHstDao);
		
		this.pigeonholeSerivce.moveDataToHistroyTable(1);
		
		EasyMock.verify(mockDocumentDao);
		EasyMock.verify(mockDocumentHstDao);
	}
	


异常:
引用
java.lang.AssertionError:
  Expectation failure on verify:
    save(com.itdcl.adapter.pojo.DocDocumentHst@f39b3a): expected: 1, actual: 0
at org.easymock.internal.MocksControl.verify(MocksControl.java:100)
at org.easymock.EasyMock.verify(EasyMock.java:1597)
at com.itdcl.adapter.service.PigeonholeServiceTest.moveDataToHistroyTable(PigeonholeServiceTest.java:201)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)


请问各位怎样修改该测试方法通过测试,谢谢!
问题补充
不错,通过啦。谢啦
问题补充
moonranger 写道
NicholasBugs 写道
这两行代码有问题:
改为
mockDocumentHstDao.save((DocDocumentHst)EasyMock.anyObject()); 
EasyMock.expectLastCall();
就可以了,这时候easyMock就不care你传的入参是什么了。


用anyObject貌似不合适吧?其实这个地方应该验证传到save方法里的DocDocumentHst是否正确。可以写一个自定义的argument matcher,在里面assert参数的正确性。

请指点一二,或完善这个测试方法也行。
2010年12月31日 10:32

4个答案 按时间排序 按投票排序

0 0

而且再仔细想一想,Mock应该提供动态替换对象的功能,这样代码就应该看起来:

Mock.replace(originalObj, mockObj);
x.originalMethod();//函数里存在originalObj的局部变量
Expect...



大家觉得对不对?要不然可能总会出现这种得把源代码复制一份,将其中不好构造的对象换成MOCK对象的误用?
不过再一想,Mock目的既然是替换难构造的对象,不容易出现的方法返回,那是不是说明,被Mock替换的对象(函数直接和周围环境交互的地方)也尽量不应该出现在方法的局部变量里,毕竟局部变量,你就只能像LZ一样COPY一段代码来测试,而且还不能说明方法被测试了。

2010年12月31日 10:32
0 0

前两天我也碰到了和LZ相同的问题。仔细想一想,LZ的函数提供了三个职责,查询、转换、存储,而LZ的测试思路是写一个DAO的MOCK, 拷贝原有函数代码来写测试,测试目的是Save方法是否调用,Save调用能保证验证方法的正确性吗(那只是你函数职责的一个而已,而且还只能保证他被调用)?并且再别人改出错误后,原有测试仍能继续使用?很明显,都不能。
所以,应将函数职责分开

public DocDocumentHst GetDDHstByDD(DocDocument document )
{
	DocDocumentHst documentHst = new DocDocumentHst();   
	BeanUtils.copyProperties(documentHst, document);   
        documentHst.setDocDocumentHstId(document.getDocDocumentId());           
	documentHst.setCommonDocEmergency(document.getCommonDocEmergency());   
        documentHst.setCommonDocSecret(document.getCommonDocSecret());   
       	documentHst.setCommonDoctype(document.getCommonDoctype());   
        documentHst.setDocSecrettimeUnit(document.getDocSecrettimeUnit());   
        documentHst.setDocSpecialReturnreceiptType(document.getDocSpecialReturnreceiptType());  

	return documentHst;
}

然后主要测试该转换函数(输入输出式测试),DAO的测试应该放到DAO中,经复合的函数只调用这三个被测试的函数,如果子部分全部正确,复合后的函数其实不用测试。这样的测试才有意义。COPY原有代码的测试行为我想是根本不行的。

2010年12月31日 10:32
0 0

NicholasBugs 写道
这两行代码有问题:
改为
mockDocumentHstDao.save((DocDocumentHst)EasyMock.anyObject()); 
EasyMock.expectLastCall();
就可以了,这时候easyMock就不care你传的入参是什么了。


用anyObject貌似不合适吧?其实这个地方应该验证传到save方法里的DocDocumentHst是否正确。可以写一个自定义的argument matcher,在里面assert参数的正确性。

2010年12月31日 10:32
0 0

这两行代码有问题:
mockDocumentHstDao.save(docHst); 
EasyMock.expectLastCall();

在这里你预期的行为是:mockDocumentHstDao的save方法会被调用,并且入参是你new出来的一个对象docHst (com.itdcl.adapter.pojo.DocDocumentHst@f39b3a)。
而当你的测试用例执行的时候,你的mockDocumentHstDao接收到的是另一个DocDocumentHst对象,因此verify是不通过的。

改为
mockDocumentHstDao.save((DocDocumentHst)EasyMock.anyObject()); 
EasyMock.expectLastCall();
就可以了,这时候easyMock就不care你传的入参是什么了。

2010年12月31日 10:32

相关推荐

    模拟测试辅助工具easyMock.zip

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较...

    EasyMock 使用方法与原理剖析

    EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩; EasyMock实践指南;...EasyMock使用技巧;...EasyMock使用简明手册;...EasyMock使用说明;...用Mock object进行隔离测试;

    EasyMock介绍及安装方法含安装方法和所有需要的软件包

    简单易用:使用 EasyMock 可以快速地生成模拟对象,并且可以通过录制、回放、检查三步来完成测试过程。 支持多种类型:EasyMock 支持对接口、抽象类以及普通的类进行模拟。 验证功能:EasyMock 提供了一些方法来验证...

    easymock的使用,含demo

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 ...

    EasyMock介绍及安装方法

    EasyMock 是一种模拟测试的框架,用于辅助模拟测试。当在测试过程中一些复杂的对象生成相当麻烦、费时或者根本无法生成时,可以用模拟的对象来代替真实的对象。 EasyMock 可以 mock 接口和 java 类,但是 class ...

    转:EasyMock 单元测试

    NULL 博文链接:https://xuan0506.iteye.com/blog/1041296

    easymock-4.2.jar

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...

    easymock-4.0-bundle

    EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定...

    easymock-2.5.2工具 下载

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。

    easymock-2.5.1.jar

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。

    easyMock3.1

    EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定...

    easymock-3.4

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 更多资源详见: http://blog.csdn.net/fanxiaobin577328725/article/details/51894331 (包含...

    easymock2.5.2

    EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定...

    easymock:EasyMock,自2001年以来使模拟变得更加容易

    轻松模拟 EasyMock是一个Java库,它提供了一种在单元测试中使用Mock对象的简便方法。 您可以在找到网站和用户文档。开发者信息建置状态环境设定我正在使用: IntelliJ 2020.3 Ultimate(感谢JetBrains获得许可) ...

    mock-framework:模拟框架示例 EasyMock ..

    模拟框架模拟框架示例 EasyMock ... 特征 1 为存根方法返回值 2 为存根方法抛出异常

    测试驱动开发的艺术

    第一部分 TDD入门第1章 综述1.1 挑战:用正确的方法解决正确的问题1.1.1 糟糕的代码质量1.1.2 不能满足客户需求1.2 解决方案:测试驱动1.2.1 高质量的TDD1.2.2 用ATDD满足客户需求1.2.3 这对我有什么好处1.3 正确地...

    powermock源码学习 支持模拟静态方法、构造函数、final类和方法、私有方法以及移除静态初始化器的模拟工具

    它基于其他单元测试模拟框架,如EasyMock进行扩展,提供了更多的功能。 PowerMock的核心功能在于其能够通过提供定制的类加载器和应用一些字节码操作技巧,实现对静态方法、构造方法、私有方法和final方法的模拟。...

    powermock单元测试

    powermock1.4.9.jar和powermock测试静态方法和私有方法的测试代码,大家都知道easymock不能测试这些,配合使用和单元测试更加完善。

Global site tag (gtag.js) - Google Analytics