`
zbg1983
  • 浏览: 39184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

当mock 遭遇继承

OO 
阅读更多
java 代码
class A{
public String a(){
return a;
}
}

public class B extends A{
public String b(){
return b;
}
}


上面所示的是一个很常见的继承结构,但是就是这样的结构导致了在Mock对象时会产生某些令人困惑的问题。

假如在BConsumer这个类中用到了B,那么就需要把B的实例(这里先不讨论应该抽象出接口与否的问题)注入到BConsumer中去。如果我们要模拟的是b()这个方法,那自然一切都没问题。我这里用的是JMock来mock具体类:


java 代码
Mockery context = new JUnit4Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};

……

@Test

public void xxx(){
BConsumer consumer = new BConsumer();
B b = context.mock(B.class);
context.checking(new Expectations(){{
allowing(b).b();
}});
consumer.setB(b);

……
}


可是如果我们需要模拟a()这个方法时,问题就出现了。


java 代码
@Test
public void xxxxx(){
BConsumer consumer = new BConsumer();
B b = context.mock(B.class);
context.checking(new Expetations(){{
allowing(b).a();
}});
consumer.setB(b);
……
}

我们可以按照上面这种方式来写Mock么?当然不行!我们Mock的是B,但是实际调用的则是A中的方法a()!

那么可能就有人想到或许可以这样做:


java 代码
@Test
public void xxxxx(){
BConsumer consumer = new BConsumer();
A a = context.mock(A.class);
context.checking(new Expetations(){{
allowing(a).a();
}});
consumer.setB((B)a);
……
}

但实际上,到了consumer.setB((B)a);这一步的时候,我们得到的a实际上是通过cglib生成的对象,要转型成B就会出现ClassCastException。

那我们到底该怎么做才好呢?难道为了Mock测试的需要,就在B中把A中的a()重写一遍?如果要抽象出接口来,又该怎样抽象才合情合理?

恳请赐教。
13:50 浏览 (1780) 论坛浏览 (2313) 评论 (4) 分类: 开发管理 收藏 相关推荐 评论
dearwolf 2007-09-25   回复
嗯……楼上说的有道理……不是JMock的错

刚刚写了几个类来测试了一些,实际上那段代码是可以通过的……汗……

我帖子中的问题是源于别人所提供的一些legacy代码,又仔细看了一下,原来在父类的方法声明中,有一个final修饰符……

对不起,耽误了大家的时间……
javavsnet 2007-09-25   回复

@Test
public void xxx(){
BConsumer consumer = new BConsumer();
B b = context.mock(B.class);
context.checking(new Expectations(){{
allowing(b).a();
}});
consumer.setB(b);
……
}

根据我的理解,理论上这里是不应该出问题的。B作为A的子类,当然可以调用A的方法,作为mock的B类对象,同样应该支持对A的方法的调用。否则这个mock的B就不是A的子类了,就破坏了OO中对继承的定义。
这里不是楼主的问题,应该是JMock的问题,虽然我还没有用过JMock(汗)。
dearwolf 2007-09-25   回复
我也觉得应该是在设计上的问题才导致了mock的困难,但是这问题所在是什么呢?
gigix 2007-09-25   回复
首先这个继承是有问题的,因为你不能随便把一个B当作一个A来用。
分享到:
评论

相关推荐

    mock对象介绍

    ### Mock对象介绍 #### 一、引言 在软件开发过程中,单元测试是确保代码质量的重要环节。然而,在测试特定代码段时,如果该代码依赖于外部系统(如数据库访问、网络请求等),就会带来一系列挑战。为了克服这些...

    mockServer,mock服务端

    当匹配到预设的请求模式时,MockServer会返回预设的响应,这可以是静态的数据、动态生成的数据或者基于某种逻辑的响应。 在"mock3"这个压缩包中,我们可以推测它可能包含MockServer的第三版相关资源,如配置文件、...

    Mock

    在编程中,当我们的代码依赖于其他不可控或难以配置的服务(如数据库、网络API等)时,Mock可以帮助我们创建一个虚拟的、可控制的替代品,这个替代品的行为和返回值是可以预设的。 描述中的链接指向了一篇关于Mock...

    基于python的mock测试数据练习

    1. `autospec=True`: 当设置为True时,mock对象会尽可能模仿原对象的行为,包括方法签名和异常处理。 2. `spec`和`spec_set`: 可以指定一个对象,让mock对象的接口与该对象一致。 通过上述方式,我们可以利用`...

    Mock是一个零侵入的服务端Mock平台,底层基于JVM Sandbox。相比于Fiddler、-mock-fe.zip

    Mock是一个强大的服务端模拟工具,它的核心特性是零侵入性,这意味着在你的实际项目代码中无需进行任何修改,即可实现服务的模拟。这极大地提高了开发效率,特别是在进行集成测试或者依赖于其他服务但又无法实时访问...

    spring-mock.jar

    Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi....

    mock

    例如,你可以设置当接收到特定请求时,Mock服务器应返回什么样的数据或状态码。 4. **脚本文件`mock.bat`和`mock.sh`**: 这两个文件分别对应Windows和Linux系统的启动脚本。`mock.bat`是批处理文件,用于在...

    模拟mock.zip

    当开发者编写与服务器交互的代码时,可以通过Mock返回预设的响应数据,使得测试过程更加可控。例如,描述中提到的链接指向了GitHub上nuysoft/Mock项目的Wiki页面,该页面详细介绍了Mock的语法规范,这可能是为了帮助...

    Centos7下mock安装rpm

    在Linux系统管理中,`Mock`是一个非常有用的工具,尤其对于开发者和打包人员而言,它能够在隔离环境中构建RPM软件包。在CentOS 7环境下,`Mock`可以帮助我们在不干扰系统其他组件的情况下测试和构建RPM包。下面将...

    mock数据.doc

    Mock.js 数据模拟技术 Mock.js 是一种流行的前端数据模拟技术,用于模拟后端接口的响应数据,使得前端开发可以独立于后端开发,提高开发效率和体验。本文将从 Mock.js 的安装、使用、方法、注意事项等方面进行总结...

    dotnet 单元测试 Mock 让一个对象继承多个接口.rar

    本资源包“dotnet 单元测试 Mock 让一个对象继承多个接口.rar”提供了关于如何在.NET中使用Mock进行单元测试,特别是当对象需要实现多个接口时的详细指南。 首先,Mock对象是在单元测试中用于替代真实依赖的对象,...

    mock在ut中的使用

    mock

    mockserver1.zip

    在软件开发中,尤其是在测试阶段,MockServer可以替代真实的后端服务,允许开发者在没有实际依赖的情况下进行单元测试和集成测试。这个“mockserver1.zip”文件包含了启动和使用MockServer所需的一些基本组件和配置...

    Django_mock.rar

    - **部署**:当开发完成且测试通过后,可以将项目部署到生产环境,如Apache、Nginx或Gunicorn + uWSGI,以便其他团队成员或系统能够使用这些Mock服务。 7. **持续集成/持续部署(CI/CD)** - **自动化测试**:将...

    googlemock

    - **定义Mock类**:创建一个继承自`::testing::MockClass`的类,其中`MockClass`是你要模拟的接口。 - **使用`ON_CALL`预置行为**:设置模拟对象在特定参数下返回特定值。 - **使用`EXPECT_CALL`设置期望**:定义...

    mock 测试.pptx

    )将选中的规则向下移动、clone克隆一个选中规则到规则框、Set latency设置响应延迟时间 ( 毫秒 )、Set Comments设置一个注释 , 来提示当前规则的作用、Edit Response 编辑当前规则设置的响应文件(当响应文件是文本...

    ApiMock操作文档

    ApiMock操作文档

    0积分:Mock对象教程

    在软件开发过程中,单元测试作为确保代码质量的重要环节,其有效性往往受到多种因素的影响,尤其是当待测方法依赖于外部资源如网络、数据库或其他复杂系统组件时。在这样的场景下,直接测试不仅耗时且容易引入耦合...

Global site tag (gtag.js) - Google Analytics