[转载]Mock —— 模拟JDBC查询

上一篇 / 下一篇  2011-01-05 21:38:21 / 个人分类:单元测试

 

参考:http://solnone.blogspot.com/search/label/Java

mock,就是假的意思。easymock或者jmock之类的框架最常用于减少外部重量级资源依赖。

 

importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.ArrayList;

importjava.util.List;

 

publicclassDBImpl {

   publicListquery(Connection conn)throwsSQLException {

      Listlist=newArrayList();

      PreparedStatement ps = conn.prepareStatement("select user from user");

      try{

          ResultSet rs = ps.executeQuery();

          try{

             while(rs.next()) {

                 list.add(rs.getString(1));

             }

          }finally{

             rs.close();

          }

      }finally{

          ps.close();

      }

      returnlist;

   }

}

 

 

importstaticorg.easymock.EasyMock.createControl;

importstaticorg.easymock.EasyMock.expect;

importstaticorg.easymock.EasyMock.matches;

 

importstaticorg.junit.Assert.assertEquals;

importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.Arrays;

importjava.util.List;

importorg.easymock.IMocksControl;

importorg.junit.After;

importorg.junit.Before;

importorg.junit.Test;

 

publicclassDBImplTest {

   privateDBImpldbimpl;

 

   @Before

   publicvoidsetUp()throwsException {

      dbimpl=newDBImpl();

   }

 

   @After

   publicvoidtearDown()throwsException {

      dbimpl=null;

   }

 

   @Test

   publicvoidtestQuery()throwsSQLException {

      IMocksControl control =createControl();

      //建立模擬物件

      Connection conn = control.createMock(Connection.class);

      PreparedStatement ps = control.createMock(PreparedStatement.class);

      ResultSet rs = control.createMock(ResultSet.class);

      //模擬物件預期行為

 

      expect(conn.prepareStatement(matches("select user from user")))

             .andReturn(ps);

      expect(ps.executeQuery()).andReturn(rs);

      expect(rs.next()).andReturn(true);

      expect(rs.getString(1)).andReturn("root");

      expect(rs.next()).andReturn(true);

      expect(rs.getString(1)).andReturn("tester");

      expect(rs.next()).andReturn(true);

      expect(rs.getString(1)).andReturn("中文");

      expect(rs.next()).andReturn(false);

      rs.close();

      ps.close();

      //錄製完成,切到replay狀態

      control.replay();

      //調用方法

      Listexpected = Arrays.asList(newString[]{"root","tester","中文"});

      

      //这个conn是假的

      List result =dbimpl.query(conn);

      assertEquals(expected, result);

      //驗證

      control.verify();

   }

}

 

 

CLASSPATH加入easymock.jarcglib-2.2.jar以及easymockclassextension.jar.

调试上述程序,dbimpl.query(conn)如期执行真正的查询操作,无须建立真正的数据库联接。


TAG:

 

评分:0

我来说两句

日历

« 2024-04-26  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 69389
  • 日志数: 44
  • 文件数: 40
  • 建立时间: 2010-12-06
  • 更新时间: 2011-05-31

RSS订阅

Open Toolbar