easymock使用教程-junit单元测试

2018-09-05|来源:

mock对象用来对一些未实现关联对象的类进行测试的对象


mock和stub的区别

 mock关注的是交互

 stub关注的是状态


EasyMock就是实现Mock对象的框架,下面是快速使用教程

1、导入easymock的jar包

官网地址:http://easymock.org/


2、Mock对象的生命周期

   三个阶段:record,replay,verify

   Mock的关注点是在交互上,主要解决的问题是对象之间的交互,诸如:Service就依赖于DAO,如果DAO没有实现,我们可以通过Mock来模拟DAO的实现。

record阶段就是用来说明这个DAO上面可能存在的值

@Test
  public void testLoad() {
    //1、创建DAO的Mock对象,目前就进入了record阶段
    IUserDao ud = EasyMock.createMock(IUserDao.class);
    User u = new User(1,"admin","123","管理员");
    //2、记录ud可能会发生的操作的结果
    /*
     * 以下代码所指的是,当在dao中调用了load方法并且参数为admin的时候,返回值是u对象
     */
    //必须把交互的所有过程都记录下来
    EasyMock.expect(ud.load("asd")).andReturn(u);
    ud.delete("abc");
    //以下用来操作没有返回值的方法
    EasyMock.expectLastCall();
    EasyMock.expect(ud.load("admin")).andReturn(u);
    //3、进入测试阶段,也就是replay阶段
    EasyMock.replay(ud);
    //创建Service和DAO的关联
    IUserService us = new UserService(ud);
    //完成测试
    User tu = us.load("admin");
    EntitiesHelper.assertUser(tu,u);
    //3、验证交互关系是否正确
    EasyMock.verify(ud);
  }


mock的几种创建方式

1、createMock

通过createMock说创建的mock对象,在进行verify的时候仅仅只是检查关联方法是否正常完成调用,如果完成次数一致就认为测试通过,不考虑顺序问题

@Test
  public void testLoadMock() {
    //1、创建DAO的Mock对象,目前就进入了record阶段
    IUserDao ud = EasyMock.createMock(IUserDao.class);
    User u = new User(1,"admin","123","管理员");
    EasyMock.expect(ud.load("asd")).andReturn(u);
    //使用的createMock,如果方法的调用顺序不一致,不会抛出异常
    ud.delete("abc");
    EasyMock.expectLastCall();
    EasyMock.expect(ud.load("admin")).andReturn(u);
    EasyMock.replay(ud);
    //创建Service和DAO的关联
    IUserService us = new UserService(ud);
    //完成测试
    User tu = us.load("admin");
    EntitiesHelper.assertUser(tu,u);
    //3、验证交互关系是否正确
    EasyMock.verify(ud);
  }


2、createStrictMock

在verify时不仅仅验证关联方法的调用次数还要验证顺序

@Test
  public void testLoadStrictMock() {
    //1、创建DAO的Mock对象,目前就进入了record阶段
    IUserDao ud = EasyMock.createStrictMock(IUserDao.class);
    User u = new User(1,"admin","123","管理员");
    EasyMock.expect(ud.load("asd")).andReturn(u);
    //使用的createStrictMock,方法的顺序不一致,所以会抛出异常
    ud.delete("abc");
    EasyMock.expectLastCall();
    EasyMock.expect(ud.load("admin")).andReturn(u);
    EasyMock.replay(ud);
    //创建Service和DAO的关联
    IUserService us = new UserService(ud);
    //完成测试
    User tu = us.load("admin");
    EntitiesHelper.assertUser(tu,u);
    //3、验证交互关系是否正确
    EasyMock.verify(ud);
  }


3、基于MockCongrol的创建

使用mockControl可以检查一组调用对象之间的关系

所以如果希望使用Strict的方式,而且依赖了两个类以上,这两个依赖类应该通过control的方式创建

/**
   * 使用mockControl可以检查一组调用对象之间的关系
   * 所以如果希望使用Strict的方式,而且依赖了两个类以上,这两个依赖类应该通过control的方式创建
   */
  @Test
  public void test05() {
    //可以通过control来创建一组mock
    IMocksControl mc = createStrictControl();
    s1 = mc.createMock(IService1.class);
    s2 = mc.createMock(IService2.class);
    s1.method1();
    expectLastCall();
    s1.method2();
    expectLastCall();
    s2.method3();
    expectLastCall();
    s2.method4();
    expectLastCall();
    //让mock控制器中的进行操作
    mc.replay();
    ms.setS1(s1);
    ms.setS2(s2);
    ms.m2();
    //验证mock控制器中的所有mock调用
    mc.verify();
  }


本文转自网络


相关问答

更多

如何使用Spring + EasyMock做Java单元测试

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量。这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate、Struts 等的集成。那么,有个问题,在普遍使用 Sprin ...

如何使用junit4写单元测试用例

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先 简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在Java里面可以 用来和public、static等关键字一样来修饰类名、方法名、变量名。修饰的作用描述这个数据是做什么用的,差不多和public描述这个数据是公 有的一样。想具体了解可以看Core Java2。废话不多说了,直接进入正题。 我们 ...

java测试工具及教程

测试看你是什么类型的测试 单元测试:Junit或TestNG Web测试:WatiJ、Selenium2.0 功能测试及压力测试:Jmeter、LoadRunner Bug管理:TestDirector

java spring项目的controller层的代码怎么用junit写单元测试用例

Spring项目controller 是依赖springmvc的 直接启动测试,是没有初始化spring容器(web.xml中初始化)的 如果是dao层 service层的测试可以用单元测试,controller层建议还是 启动web项目吧 补充一下Java WEB开发基础知识

Spring Boot中使用Test单元测试报错javax.websocket.server.ServerContainer not available。

那说明单元测试里面没有包含servercontainer吧,单元测试加载的东西没有项目正规启动以后那么多,需要仔细检查如何在单元测试中加载servercontainer。

junit教程

相关文章

更多

最近更新

更多