当前位置: 首页 > news >正文

Spring JdbcTemplate Junit 测试 - ResultSetExtractor/RowMapper

Spring JdbcTemplate Junit 测试覆盖率 - 以 ResultSetExtractor / RowMapper 为例

1、RowMapper Mockito 测试

(1)创建实体类 User

@Data
public class User {private Integer id;private String name;private String applicant;private String address;private Boolean flag;
}

(2)JdbcTemplate 业务代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;@Repository
public class InsertGroup {@AutowiredJdbcTemplate jdbcTemplate;public List<User> getUsers(String sql, String name, String address) {return jdbcTemplate.query(sql, new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("ID"));user.setName(rs.getString("Name"));user.setApplicant(rs.getString("Applicant"));user.setAddress(rs.getString("Address"));user.setFlag(rs.getBoolean("Flag"));return user;}}, name, address);}
}

(3)Junit 测试

package com.example.dao;import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
public class InsertGroupTest {@MockJdbcTemplate jdbcTemplate;@InjectMocksInsertGroup insertGroup;@Beforepublic void init() {MockitoAnnotations.openMocks(this);}@Testpublic void test() {/*** 需要注意的是:invocation.getArgument(1)* jdbcTemplate.query() 中 Mock 的参数索引是以0开始的,RowMapper 是第二个元素,因此索引是 1,如果是第三个位置,那么索引是 2,即 invocation.getArgument(2)* 同时需要注意的是,jdbcTemplate 中 query 的方法有很多,但是传的参数是不同的,因此 Mock 的参数数量要根据自己实际用到的 query 参数为准*/Mockito.when(jdbcTemplate.query(ArgumentMatchers.anyString(), ArgumentMatchers.any(RowMapper.class), ArgumentMatchers.any())).thenAnswer((invocation) -> {RowMapper<User> rowMapper = (RowMapper<User>) invocation.getArgument(1);ResultSet rs = Mockito.mock(ResultSet.class);// Mock ResultSet to return one rows.// Mockito.when(rs.getInt(ArgumentMatchers.eq("ID"))).thenReturn(506);// Mock ResultSet to return two rows.Mockito.when(rs.getInt(ArgumentMatchers.eq("ID"))).thenReturn(412, 300);Mockito.when(rs.getString(ArgumentMatchers.eq("Name"))).thenReturn("刘亦菲", "刘诗诗");Mockito.when(rs.getBoolean(ArgumentMatchers.eq("Flag"))).thenReturn(true, false);List<User> users = new ArrayList<>();users.add(rowMapper.mapRow(rs, 0));users.add(rowMapper.mapRow(rs, 1));return users;});List<User> userList = insertGroup.getUsers("sql", "1", "2");// Assert First RowassertFirstUser(userList.get(0));// Assert Second RowassertSecondUser(userList.get(1));}public void assertFirstUser(User user) {Assert.assertEquals(Integer.valueOf(412), user.getId());Assert.assertEquals("刘亦菲", user.getName());Assert.assertTrue(user.getFlag());}public void assertSecondUser(User user) {Assert.assertEquals(Integer.valueOf(300), user.getId());Assert.assertEquals("刘诗诗", user.getName());Assert.assertFalse(user.getFlag());}
}
2、ResultSetExtractor Mockito 测试

(1)创建 User 实体

import lombok.Data;@Data
public class User {private Integer id;private String name;private String applicant;private String address;private Boolean flag;
}

(2)JdbcTemplate 业务代码

 public List<User> getUsers2(String sql, String name, String address) {return jdbcTemplate.query(sql, new ResultSetExtractor<List<User>>() {@Overridepublic List<User> extractData(ResultSet rs) throws SQLException, DataAccessException {List<User> userList = new ArrayList<>();while (rs.next()) {User user = new User();user.setId(rs.getInt("ID"));user.setName(rs.getString("Name"));user.setApplicant(rs.getString("Applicant"));user.setAddress(rs.getString("Address"));user.setFlag(rs.getBoolean("Flag"));userList.add(user);}return userList;}}, name, address);}

(3)Junit 测试

 @Testpublic void test2() {Mockito.when(jdbcTemplate.query(ArgumentMatchers.anyString(), ArgumentMatchers.any(ResultSetExtractor.class), ArgumentMatchers.any())).thenAnswer((invocation) -> {ResultSetExtractor<List<User>> resultSetExtractor =(ResultSetExtractor<List<User>>) invocation.getArgument(1);ResultSet rs = Mockito.mock(ResultSet.class);// two times it returns true and third time returns false.Mockito.when(rs.next()).thenReturn(true, true, false);// Mock ResultSet to return two rows.Mockito.when(rs.getInt(ArgumentMatchers.eq("ID"))).thenReturn(412, 300);Mockito.when(rs.getString(ArgumentMatchers.eq("Name"))).thenReturn("刘亦菲", "刘诗诗");Mockito.when(rs.getBoolean(ArgumentMatchers.eq("Flag"))).thenReturn(true, false);return resultSetExtractor.extractData(rs);});List<User> users = insertGroup.getUsers2("sql", "1", "2");Assert.assertEquals(Integer.valueOf(412), users.get(0).getId());Assert.assertEquals("刘亦菲", users.get(0).getName());Assert.assertTrue(users.get(0).getFlag());}
http://www.lryc.cn/news/232165.html

相关文章:

  • RabbitMQ实战
  • UI游戏设计模板大放送:7种别具匠心的创意!
  • 酷开系统 酷开科技,将家庭娱乐推向新高潮
  • 我精心制作的 python 一小时极简课程来了 ≧◠◡◠≦ 免安装程序+精简核心概念
  • 220V交流转直流的简易电源设计
  • 使用Nginx和uwsgi在自己的服务器上部署python的flask项目
  • 【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装
  • 【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例
  • 【数据分享】1961—2022年全国范围的逐日降水栅格数据
  • [Linux] 网络文件共享服务
  • 二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>
  • 非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)
  • 创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意
  • Linux网络应用层协议之http/https
  • LLM(四)| Chinese-LLaMA-Alpaca:包含中文 LLaMA 模型和经过指令微调的 Alpaca 大型模型
  • 虚拟机CentOS 8 重启后不能上网
  • 让AI拥有人类的价值观,和让AI拥有人类智能同样重要
  • 《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
  • ROS stm32 CAN通信
  • 简单地聊一聊Spring Boot的构架
  • 【算法】复习搜索与图论
  • 【KCC@南京】KCC南京数字经济-开源行
  • 苍穹外卖-day11
  • git_07_协同开发
  • 对比国内主流开源 SQL 审核平台 Yearning vs Archery
  • Mistral 7B 比Llama 2更好的开源大模型 (三)
  • 关于 Git 你了解多少?
  • 关于Elasticsearch的自动补全、数据同步和集群,以下是相关的知识点
  • linux套接字-Socket
  • debian 修改镜像源为阿里云【详细步骤】