Spring JdbcTemplate ResultSetExtractor Junit test example

Spring JdbcTemplate ResultSetExtractor Junit test example

  • Mockito模拟jdbcTemplate.query()方法代码块

  • 这个例子展示了如何编写 Junit 来测试 Spring ResultSetExtractor 功能,同时使用 Mockito 模拟 JdbcTemplate

  • 这也增加了 ResultSetExtractor 代码的代码覆盖率。

  • 下面是使用 Lambda 使用 ResultSetExtractor 返回员工的 DAO 类

Spring JdbcTemplate ResultSetExtractor Example with Lambdas

package com.wsq.dao;

import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.wsq.beans.Employee;

@Repository
public class EmployeeDAO {

@Autowired
private JdbcTemplate jdbcTemplate;

public Map<Integer, Employee> getEmployeeMap() {
    return jdbcTemplate.query("SELECT ID, NAME, STATUS FROM EMPLOYEE",
        (ResultSet rs) -> {
            Map<Integer, Employee> employeeMap = new HashMap<>();
            while (rs.next()) {
                Employee employee = new Employee();
                employee.setId(rs.getInt("ID"));
                employee.setName(rs.getString("NAME"));
                employee.setStatus(rs.getBoolean("STATUS"));
                employeeMap.put(employee.getId(), employee);
            }
            return employeeMap;
    });
}
}
  • 下面是通过模拟 JdbcTemplate 返回两行来测试 ResultSetExtractor 代码的 Junit 测试类。

Spring JdbcTemplate ResultSetExtractor Junit test example

package com.wsq.dao;

import static org.mockito.Mockito.when;

import java.sql.ResultSet;
import java.util.Map;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatchers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

import com.wsq.beans.Employee;

@RunWith(MockitoJUnitRunner.class)
public class EmployeeDAOTest {

    @Mock
    private JdbcTemplate jdbcTemplate;

    @InjectMocks
    private EmployeeDAO employeeDAO;

    @SuppressWarnings("unchecked")
    @Test
    public void testGetEmployeeMap() {

        Mockito.when(jdbcTemplate.query(
            ArgumentMatchers.anyString(), ArgumentMatchers.any(ResultSetExtractor.class)))
            .thenAnswer((invocation) -> {

            //invocation.getArgument(1) 这里要注意,因为使用了2个参数,所以我们在Mock第2个参数代码块部分,索引下标是1
            //假如使用jdbcTemplate.query(sql, Object[], RowMapper),那么我们在mock -》 RowMapper时,就需要索引使用2:invocation.getArgument(2)
            //当然上面也要修改:jdbcTemplate.query(ArgumentMatchers.anyString(), (Object [])ArgumentMatchers.any(),ArgumentMatchers.any(RowMapper.class)))
            .thenAnswer((invocation)
                ResultSetExtractor<Map<Integer, Employee>> resultSetExtractor = 
                    (ResultSetExtractor<Map<Integer, Employee>>) invocation.getArgument(1);
                
                ResultSet rs = Mockito.mock(ResultSet.class);
                
                // two times it returns true and third time returns false.
                when(rs.next()).thenReturn(true, true, false);

                // Mock ResultSet to return two rows.
                Mockito.when(rs.getInt(ArgumentMatchers.eq("ID")))
                    .thenReturn(506, 400);
                Mockito.when(rs.getString(ArgumentMatchers.eq("NAME")))
                    .thenReturn("Jim Carrey", "John Travolta");
                Mockito.when(rs.getBoolean(ArgumentMatchers.eq("STATUS")))
                    .thenReturn(true, false);

                return resultSetExtractor.extractData(rs);
        });

        Map<Integer, Employee> employeeMap = employeeDAO.getEmployeeMap();
        
        // Assert First Row
        assertFirstUser(employeeMap.get(506));

        // Assert Second Row
        assertSecondUser(employeeMap.get(400));
    }

    public void assertFirstUser(Employee employee) {
        Assert.assertEquals(Integer.valueOf(506), employee.getId());
        Assert.assertEquals("Jim Carrey", employee.getName());
        Assert.assertTrue(employee.isStatus());
    }
    
    public void assertSecondUser(Employee employee) {
        Assert.assertEquals(Integer.valueOf(400), employee.getId());
        Assert.assertEquals("John Travolta", employee.getName());
        Assert.assertFalse(employee.isStatus());
    }
}

最后喜欢的小伙伴,记得关注收藏哦!😏🍭😘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值