`
hwy1782
  • 浏览: 153786 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jmock 中unexpected invocation错误

 
阅读更多

远程服务接口

 

public interface RemoteService {

    public BaseResult findMemberById(Query query);

    public String addMethod();
}

返回值封装对象

 

public class BaseResult {
	
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

 服务类

 

public class RealService {

    private RemoteService remoteService;

    public void doExecute(String memberId) {
    	BaseResult apple = null;
    	Query query = new Query(memberId);
    	apple = getRemoteService().findMemberById(query);
        System.out.println(apple);
    }

	public RemoteService getRemoteService() {
		return remoteService;
	}

	public void setRemoteService(RemoteService remoteService) {
		this.remoteService = remoteService;
	}

}

 jmock模拟测试

 

public class RealServiceTest extends TestCase {

    private RealService service = new RealService();

    @Test
    public void testDoExecute() {

        Mockery context = new Mockery();
        final RemoteService remoteService = context.mock(RemoteService.class);
        final BaseResult result = new BaseResult();
        final Query query = new Query("test");
        result.setName("apple");
        
        context.checking(new Expectations() {

            {
                oneOf(remoteService).findMemberById(query);
                will(returnValue(result));
            }
        });

        service.setRemoteService(remoteService);
        service.doExecute("test120");
        context.assertIsSatisfied();
    }

}

 运行报错:

 

 写道
unexpected invocation: morganService.findMemberById(<com.jmockTest.Query@14a8cd1>)
expectations:
expected once, never invoked: morganService.findMemberById(<com.jmockTest.Query@e0b6f5>)
parameter 0 did not match: <com.jmockTest.Query@e0b6f5>, because was <com.jmockTest.Query@14a8cd1>; returns <name apple price 0.0 info null>
what happened before this: nothing!
…………
…………

 观察错误:

com.jmockTest.Query@14a8cd1

com.jmockTest.Query@e0b6f5

有两个Query对象的引用,说明一个问题:Query 这个类被new了两次,RealServiceTest 这个类中new了一次,而RealService 中也new了一次。

jmock使用的代理机制,运行测试类时,参数值不一致,出错。

 

解决方案:http://www.jmock.org/cheat-sheet.html

 

 

有一句话:
To define looser constraints, specify all arguments as matchers within with clauses:

allowing (calculator).add(with(any(int.class)), with(any(int.class)));
 

 

使用: oneOf(remoteService).findMemberById(with(any(Query.class))); 这句解决问题。

 

 

分享到:
评论

相关推荐

    JMOCK 帮助 网页 文档

    JMock 是一个Java平台上的单元测试框架,专门用于模拟对象,以便在测试过程中控制和验证对象的行为。它基于EasyMock库,但提供了更强大的功能,尤其是对于处理复杂交互和顺序的场景。JMock使得开发者可以在不依赖...

    JMock

    JMock 是一个流行的开源测试框架,专为Java开发者设计,用于模拟对象的行为,特别是在单元测试中。它允许程序员在不依赖真实对象的情况下测试代码,提高了测试的效率和隔离性。这篇详尽的讨论将深入JMock的核心概念...

    Jmock2.6 jar包

    **Jmock2.6 Jar包**是Java编程领域中用于单元测试的重要库,它提供了模拟对象的功能,使得开发者能够在测试代码时对复杂依赖关系进行控制和隔离。在本文中,我们将深入探讨Jmock2.6的核心特性、使用场景以及如何在...

    jmock cookbook 资源整合

    通过《JMock Cookbook》的学习,开发者可以了解到如何在实际项目中有效地利用JMock进行测试驱动开发(TDD)和行为驱动开发(BDD),提高代码质量,减少回归错误,并提升开发效率。这本书详细讲解了各种场景下的最佳实践...

    JMOCK使用文档

    JMock是一个开源的Java库,它允许开发者在测试中创建和控制对象的行为。通过模拟对象,我们可以隔离被测试代码,专注于测试单个组件的功能,而无需担心其他部分的影响。JMock使用Java语言本身编写,因此与其他Java...

    jmock2.5.1.zip

    jMock,作为Java平台上的一个开源模拟框架,为开发者提供了一种高效、灵活的方式来创建和控制对象的行为,以便在测试中隔离复杂的依赖关系。jMock 2.5.1是该框架的一个版本,它在前一版本的基础上进行了优化和改进,...

    jmock-2.6.0-jars

    `jmock`是Java平台上的一个模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便能够隔离测试并精确地指定期望的交互。下面我们将深入探讨`jmock`的关键概念和功能。 ### 1. 模拟框架概述 `jmock`属于...

    jmock-2.5.1-javadoc

    jMock与jUnit的集成非常紧密,通常我们会在jUnit测试类中使用jMock来模拟对象。以下是一个简单的示例: ```java import static org.jmock.Expectations.*; import org.junit.Test; import org.jmock.Mockery; ...

    jmock-1.2.0-jars.zip

    这个压缩包中的两个主要文件——jmock-core-1.2.0.jar和jmock-cglib-1.2.0.jar,是进行JMock测试时所必需的组件。 首先,我们来看jmock-core-1.2.0.jar。这是JMock的核心库,提供了模拟对象的基本功能。它包括了...

    jmock-1.2.0-jars.rar

    在 JUnit 中,你可以使用 `jmock-junit3` 或 `jmock-junit4` 包,它们提供了一个 JUnit Rule,使得在测试类中使用 JMock 更加方便。 6. **版本信息** 这个压缩包中的 "jmock-1.2.0-jars" 提供的是 JMock 1.2.0 ...

    jmock2.5.1和easymock3.0

    JMock是一个强大的模拟框架,它允许开发者创建和控制模拟对象,这些对象可以在测试中替代真实的对象,从而减少对实际环境的依赖。JMock 2.5.1版本提供了更多的功能和改进,比如: 1. **模拟接口和类**:JMock不仅...

    软件测试资料集合,jtest,jmock

    `jmock-2.6.0-RC2-jars.zip`和`jmock-2.5.1-jars.zip`则包含了相应的库文件,可以直接在项目中引用。 **j-testng-sample.zip 和 jtester-0.8.2.zip** `j-testng-sample.zip`可能是一个包含`TestNG`测试框架示例的...

    maven+jmock

    标题 "maven+jmock" 暗示了我们要讨论的是如何在 Maven 项目中使用 JMock 进行单元测试。Maven 是一个流行的构建自动化工具,用于管理项目的构建、依赖和文档,而 JMock 是一个 Java 代码模拟库,允许开发者在测试中...

    jmock jar包及doc文档

    JMock是一个用于创建和验证对象行为的模拟框架,它允许开发者在测试中模拟对象的行为,而不是依赖于真实的对象。在单元测试中,我们通常希望隔离被测试的代码,避免外部依赖对测试结果的影响。JMock就是为此目的而...

    Jmock Mock 没有接口的类

    在 JMock 中,如果我们要模拟一个没有接口的类,可以使用 CGLIB 来创建该类的子类。首先,你需要在项目中引入 CGLIB 的依赖,这里提供的 `cglib-full-2.0.jar` 和 `jmock-cglib-1.0.1.jar` 文件包含了 CGLIB 的相关...

    jmock-1.2.0.jar

    Maven-Central / jmock / jmock-cglib 1.2.0 Maven-Central / org.apache.activemq / activemq-ra 5.2.05.1.0 Maven-Central / org.apache.maven.shared / maven-dependency-tree 1.21.1 Maven-Central / org.apache...

    JMOCK-2.6.0

    在JMOCK-2.6.0版本中,我们看到了这一功能的进一步优化和增强。 首先,让我们了解一下JMOCK是如何工作的。JMOCK基于Mockery API,这是一个简洁且直观的接口,允许开发者声明预期的方法调用和它们的结果。比如,你...

Global site tag (gtag.js) - Google Analytics