`

easymock教程-命名mock对象

阅读更多

    在创建mock对象的时候,我们可以命名mock对象。

 

    前面我们谈到easymock中有三种mock对象,分别用下面三个方法创建:

 

createMock(Class<T> toMock)
createStrictMock(Class
<T> toMock)
createNiceMock(Class
<T> toMock)

    带有命名功能的方法也有对应的三种:

createMock(String name, Class<T> toMock)
createStrictMock(String name, Class
<T> toMock)
createNiceMock(String name, Class
<T> toMock)

    命名mock对象有什么好处呢?其实就是一点,即在当测试案例因为某个mock对象的状态或行为不符合要求而失败的时候,在异常信息里面可以输出这个mock对象的名称。

 

    我们用实际的例子来看,同样是创建一个mock对象,然后调用一个没有record的方法,easymock报错退出的测试案例。

 

1. 不命名

    Service service = EasyMock.createMock(Service.class);

    异常信息如下:

java.lang.AssertionError:
  Unexpected method call execute():
 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
 at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:73)
 at net.sourcesky.study.easymock.tutorial.$Proxy4.execute(Unknown Source)
 at net.sourcesky.study.easymock.tutorial.NamingMockTest$Business.execute(NamingMockTest.java:11)
 at net.sourcesky.study.easymock.tutorial.NamingMockTest.testExecute(NamingMockTest.java:31)
 ......

    这里的错误信息"Unexpected method call execute()",只指出了发生错误的是execute()方法,并未指出具体是哪个mock对象。
   
    当测试案例简单时,比如就一两个mock对象,我们可以直接从方法名上就看出是哪个mock对象。但是当mock对象多了之后,尤其是方法很多的时候,就会浪费时间。


2. 命名后

Service service = EasyMock.createMock("service", Service.class);

    异常信息如下:

java.lang.AssertionError:
  Unexpected method call service.execute():
 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
 at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:73)
 at net.sourcesky.study.easymock.tutorial.$Proxy4.execute(Unknown Source)
 at net.sourcesky.study.easymock.tutorial.NamingMockTest$Business.execute(NamingMockTest.java:11)
 at net.sourcesky.study.easymock.tutorial.NamingMockTest.testExecute(NamingMockTest.java:30)

 

    差别只在错误信息中"Unexpected method call serviceMock.execute()" 包含serviceMock的字样,因此我们可以快递定位到具体的mock对象。

 

    命名mock对象在初次编写测试案例时用处还不是很明显,因为编写者当时肯定对代码很熟悉。但是当另外一个开发人员因为某此修改代码造成测试案例不能通过时,由于这个开发人员对代码的熟悉程度不够,因此命名mock对象可以对他有所帮助,方便维护。

 

    命名之后的mock对象,还有一个特殊的地方就是toString()方法将返回该mock对象的名称,以代码为例:

        Service service = EasyMock.createMock("service", Service.class);
        System.out.println(service.toString());

    输出就是"service",对比不命名mock对象的情况:

        Service service = EasyMock.createMock(Service.class);
        System.out.println(service.toString());

    得到的输出是"EasyMock for interface net.sourcesky.study.easymock.tutorial.NamingMockTest$Service".

 

 

分享到:
评论

相关推荐

    easymock详解教程

    #### 1.16 easymock教程-命名mock对象 为mock对象命名有助于提高测试代码的可读性和可维护性。 - **命名mock对象**:可以在创建mock对象时为其指定名称。 - **访问名称**:可以通过`getName`方法获取mock对象的...

    easymock教程

    - **命名Mock对象**:为了提高测试代码的可读性,建议给Mock对象起有意义的名字。 ##### 1.17 使用MockControl - **MockControl**:早期版本的Easymock使用MockControl来创建Mock对象。虽然现在更推荐使用Easymock...

    轻仿即刻数据来自easymock的服务

    EasyMock是一个开源的Java库,它允许开发者创建模拟对象来测试他们的代码,而无需实际依赖外部服务或数据库。在这里,它被用来模拟即刻应用(即刻API)的某些数据,从而简化了开发流程。 即刻是一款深受用户喜爱的...

    junit mock

    Mocking框架如Mockito和EasyMock可以帮助开发者创建和管理mock对象,它们提供了丰富的API来设置mock对象的行为,如期望调用和返回值。在Servlet的doGet()测试中,可以使用mock的HttpRequest和HttpResponse对象,而在...

    此资源包含4种mock源码

    Easymock是一个简单的模拟框架,它允许开发者创建和控制模拟对象。Easymock的核心概念是记录和回放,开发者首先记录期望的方法调用,然后在回放阶段检查这些调用是否按预期执行。Easymock支持静态方法模拟和扩展到...

    mockito单元测试

    // 创建一个命名为"myMockedList"的Mock对象 List mockedList = mock(List.class, "myMockedList"); // 创建一个带有默认行为的Mock对象 List mockedList = mock(List.class, Answers.RETURNS_DEFAULTS); // 创建...

    Java单元测试入门

    Mockito是Java中一个广泛使用的Mock框架,它提供了简洁的API来创建和验证Mock对象。使用Mockito进行单元测试时,可以遵循“given when then”的模式来命名测试方法,并且建议一个测试案例中只包含一个断言。 ...

    jTester使用指南(带书签).pdf

    - **规则说明**:根据一定的命名规则自动注入 bean。 **5.4 Spring Bean 依赖项查找规则** - **规则说明**:按照一定的顺序查找依赖项。 **5.5 特殊实现类的 bean 注册** - **示例代码**: ```java import org....

    test

    Mockito、EasyMock等库提供了创建mock对象的功能。 9. **自动化测试**:通过脚本或工具自动执行测试,提高效率,减少手动测试的错误。Selenium、Appium等工具用于Web和移动应用的自动化测试。 10. **测试金字塔**...

    rtCampNG:rtCamp 的 QA 作业

    Java 社区有多个 mocking 工具,如 Mockito 和 EasyMock,它们可以帮助创建模拟对象,避免真实对象对测试结果的影响。 4. **持续集成/持续部署(CI/CD)**:为了确保代码质量,项目通常会集成 Jenkins、GitLab CI/...

Global site tag (gtag.js) - Google Analytics