技术开发 频道

使用jMock辅助单元测试

【IT168 技术文章】

    jMock是Junit的一个增强库。源于http://www.jmock.org
  
    jMock简单易用,非常适合TDD中的Mock测试模式。

  首先我们来看一段简单测试代码
  
  package name.nona.test.jmock;
  
  import java.sql.SQLException;
  import java.sql.Statement;
  
  import org.jmock.Mock;
  import org.jmock.MockObjectTestCase;
  
  public class TestUsageOfJmock extends MockObjectTestCase {
   public void testDatabaseUseage() throws SQLException{
   Mock mockStmt = new Mock(Statement.class);
   String sql = "select * from test";
   mockStmt.expect(once()).method("execute")
  .with(eq(sql)).will(returnValue(false));
   Statement stmt = (Statement) mockStmt.proxy();
   assertFalse(stmt.execute(sql));
   }
  
  }
  
  可以看到,上面是制作了一个假的(Mock)的Statement对象,
  通过对这个对象的execute操作,返回一个false值。
  其中,关键的语句是
  mockStmt.expect(once()).method("execute").with(eq(sql)).will(returnValue(false));
  解释如下:
    expect: 期待的执行次数,可以有 once,atLeastOnce(),notCalled()三种。
    method 期待调用的方法名,这里是execute
    with 方法需要的参数,如果没有的话就不用写with,直接will
    will 返回值,没有就不写啦
    其中的once, eq, returnValue都是继承自MockObjectTestCase的方法。
  
    执行后,Green,成功。尝试两次调用 assertFalse(stmt.execute(sql)); 提示错误。
  
    jMock是通过CGLIB的DynamicProxy来实现的mock功能。
  
    注:本文仅是对jMock的一个简单介绍,没有太多内容。更多的东西需要你自己来探索,例如jMock的设计很有意思,使用了ValueObject模式等等。

0
相关文章