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());
}
}
最后喜欢的小伙伴,记得关注收藏哦!😏🍭😘