利用EasyMock生成数据库连接简单测试示例

复制代码
package demo.mock;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class LoginAction{
    
    public String login(Connection conn, String name, int pas) {
        
        PreparedStatement pst = null;
        ResultSet rs = null;
        
        try {
            String sql = "select * from user where name = ? and pas = ?";
            pst = conn.prepareStatement(sql);
            pst.setString(1, name);
            pst.setInt(2, pas);
            rs = pst.executeQuery();
            
            if(rs.next()) {
                return "登陆成功。";
            } else {
                return "登陆失败。";
            }
            
        }catch(SQLException e) {
            e.printStackTrace();
            return "抛出异常。";
        } finally {        
            try {
                rs.close();
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}


package demo.mock;

import static org.easymock.EasyMock.createControl;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class LoginActionTest {
    
    private LoginAction login;
    
    @Before
    public void init() {
        login = new LoginAction();
    }
    
    @After
    public void destory() {
        login = null;
    }

    @Test
    public void login() throws SQLException{
        String name = "admin";
        int pas = 123;
        
        //创建Mock对象
        IMocksControl control = createControl(); //创建多个Mock对象时通过IMocksControl管理

        Connection conn = control.createMock(Connection.class);
        PreparedStatement pst = control.createMock(PreparedStatement.class);
        ResultSet rs = control.createMock(ResultSet.class);

        // 录制信息,即设定Mock对象的预期行为和输出
        // 所有Mock对象需要执行的方法都必须录制,如pst.setInt(2, pas)、rs.close()等
        String sql = "select * from user where name = ? and pas = ?";
        expect(conn.prepareStatement(sql)).andReturn(pst).times(1);     
        
        pst.setString(1, name);
        pst.setInt(2, pas);
        
        expect(pst.executeQuery()).andReturn(rs);
        expect(rs.next()).andReturn(true);
        
        
        rs.close();
        pst.close();
        
        //录制完成,切换replay状态
        control.replay();
        
        //调用实际的方法
        String res = login.login(conn, name, pas);
        String expected = "登陆成功。";
        assertEquals(expected, res);
        
        //验证
        control.verify();
    
    }

}
复制代码

 

posted on   luzhouxiaoshuai  阅读(572)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2017-04-24 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
2017-04-24 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化
2017-04-24 黎活明8天快速掌握android视频教程--20_采用ContentProvider对外共享数据
2017-04-24 黎活明8天快速掌握android视频教程--19_采用ListView实现数据列表显示
2017-04-24 黎活明8天快速掌握android视频教程--18_在SQLite中使用事务
2017-04-24 黎活明8天快速掌握android视频教程--17_创建数据库与完成数据添删改查
2017-04-24 黎活明8天快速掌握android视频教程--16_采用SharedPreferences保存用户偏好设置参数

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示