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 单元测试

    这篇文档将深入探讨 EasyMock 的使用方法和原理,以便更好地理解和应用这一工具。 首先,让我们理解 EasyMock 的核心概念。EasyMock 允许开发者创建“mock”对象,这些对象在测试时代替实际依赖,以便我们可以控制...

    EasyMock单元测试例子

    8. **最后的清理**:在测试结束时,使用`EasyMock.reset(mockObject)`清除模拟对象的状态,以便于下一次使用。 通过"EasyMock单元测试例子"中的代码,我们可以深入学习如何设置和使用这些特性。每个示例都会包含...

    Junit+EasyMock单元测试使用资料以及案例分析

    2. **回放阶段**:在测试方法中,调用模拟对象的方法,EasyMock会检查调用是否与录制时一致。 3. **验证阶段**:测试完成后,使用`EasyMock.verify()`来确保所有预期的调用都已发生,没有意外的调用。 **案例分析**...

    easymock测试servlet

    在"easymock测试servlet"的场景中,我们看到`SampleServletTest`类正在使用Easymock来测试`SampleServlet`类的行为。以下是一些关键知识点: 1. **Easymock库**:Easymock是一个开源库,它提供了模拟Java对象的方法...

    EasyMock

    在工具方面,EasyMock提供了方便的API和集成到各种测试框架(如JUnit)的能力,使得开发者可以轻松地在测试代码中使用模拟对象。此外,EasyMock还支持扩展,比如通过EasyMock Class Extension来模拟静态方法和最终类...

    模拟测试辅助工具easyMock.zip

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

    EasyMock 使用方法与原理剖析

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

    EasyMock介绍和使用

    3. **启动测试**:调用`replay()`方法开始执行测试,此时EasyMock将开始记录实际发生的调用。 4. **验证行为**:测试完成后,调用`verify()`方法,EasyMock会检查实际的调用是否符合预设。 5. **结束模拟**:测试...

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

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

    easymock的使用,含demo

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

    EasyMock 使用案例(含lib)

    7. **清理**:最后,记得使用`EasyMock.verify()`和`EasyMock.reset()`方法来清理模拟对象,确保每个测试用例之间不会相互影响。 在`EasyMockDemo`中,你可能会看到类似这样的代码结构: ```java import org....

    easyMock

    - **创建模拟对象**:你可以使用`EasyMock.createMock()`方法创建一个模拟对象,然后通过`EasyMock.replay()`进入“播放”模式,让模拟对象按照预期执行。 - **设置预期**:使用`expect()`方法设置对模拟对象的期望...

    easymock.jar,easymockclassextension.jar

    5. **验证和结束**:在测试完成后,使用`verify`方法验证模拟对象的行为,然后调用`reset`方法清理模拟状态。 6. **编写测试代码**:在测试代码中,使用模拟对象代替真实对象,以便控制测试环境。 这两个JAR文件的...

    EasyMock.jar

    这种方式使得我们可以在测试中精确地控制被测试方法的输入和输出,从而进行更精确的测试。 在EasyMock 2.5.1版本中,你可以期待以下特性: 1. **模拟对象创建**:使用`EasyMock.createMock()`方法创建模拟对象。这...

    easymock-3.2.zip

    例如,使用`@Before`注解设置测试前的准备工作,使用`@Test`注解定义测试方法,并在其中使用EasyMock的API进行模拟和验证。 总之,EasyMock 3.2 提供了一个强大而灵活的模拟工具,帮助开发者编写高质量的单元测试,...

    EasyMock介绍及安装方法

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

    easymock2.4+EasyMock使用简明手册.pdf

    下面将详细介绍EasyMock 2.4的核心概念、使用方法以及其在单元测试中的重要性。 一、EasyMock基本概念 1. **模拟对象(Mock Object)**:EasyMock允许我们创建模拟对象,这些对象可以模仿真实对象的行为,但不会...

    easymock-2.5.2工具 下载

    6. **静态方法模拟**:虽然静态方法通常难以模拟,但EasyMock提供了一种方式来模拟这些方法,这在处理依赖于静态代码的测试场景中非常有用。 在使用EasyMock时,开发者通常会结合其他单元测试框架,如JUnit或TestNG...

Global site tag (gtag.js) - Google Analytics