Spring JdbcTemplate Junit thí nghiệm bao trùm suất - lấy ResultSetExtractor / RowMapper vì lệ
1, RowMapper Mockito thí nghiệm
( 1 ) sáng tạo thật thể loại User
@Data
publicclassUser{
privateIntegerid;
privateStringname;
privateStringapplicant;
privateStringaddress;
privateBooleanflag;
}
( 2 ) JdbcTemplate nghiệp vụ số hiệu
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.jdbc.core.RowMapper;
importorg.springframework.stereotype.Repository;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.List;
@Repository
publicclassInsertGroup{
@Autowired
JdbcTemplatejdbcTemplate;
publicList<User>getUsers(Stringsql,Stringname,Stringaddress){
returnjdbcTemplate.query(sql,newRowMapper<User>(){
@Override
publicUsermapRow(ResultSetrs,introwNum)throwsSQLException{
Useruser=newUser();
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"));
returnuser;
}
},name,address);
}
}
( 3 ) Junit thí nghiệm
packagecom.example.dao;
importorg.junit.Assert;
importorg.junit.Before;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.mockito.*;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.jdbc.core.RowMapper;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
importjava.sql.ResultSet;
importjava.util.ArrayList;
importjava.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
publicclassInsertGroupTest{
@Mock
JdbcTemplatejdbcTemplate;
@InjectMocks
InsertGroupinsertGroup;
@Before
publicvoidinit(){
MockitoAnnotations.openMocks(this);
}
@Test
publicvoidtest(){
/**
* yêu cầu chú ý chính là: invocation.getArgument(1)
* jdbcTemplate.query() trung Mock tham số hướng dẫn tra cứu này đây 0 bắt đầu, RowMapper là cái thứ hai nguyên tố, bởi vậy hướng dẫn tra cứu là 1, nếu là cái thứ ba vị trí, như vậy hướng dẫn tra cứu là 2, tức invocation.getArgument(2)
* đồng thời yêu cầu chú ý chính là, jdbcTemplate trung query phương pháp có rất nhiều, nhưng là truyền tham số là bất đồng, bởi vậy Mock tham số số lượng muốn căn cứ chính mình thực tế dùng đến query tham số vì chuẩn
*/
Mockito.when(jdbcTemplate.query(
ArgumentMatchers.anyString(),ArgumentMatchers.any(RowMapper.class),ArgumentMatchers.any()))
.thenAnswer((invocation)->{
RowMapper<User>rowMapper=(RowMapper<User>)invocation.getArgument(1);
ResultSetrs=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("Lưu Diệc Phi","Lưu Thi Thi");
Mockito.when(rs.getBoolean(ArgumentMatchers.eq("Flag")))
.thenReturn(true,false);
List<User>users=newArrayList<>();
users.add(rowMapper.mapRow(rs,0));
users.add(rowMapper.mapRow(rs,1));
returnusers;
});
List<User>userList=insertGroup.getUsers("sql","1","2");
// Assert First Row
assertFirstUser(userList.get(0));
// Assert Second Row
assertSecondUser(userList.get(1));
}
publicvoidassertFirstUser(Useruser){
Assert.assertEquals(Integer.valueOf(412),user.getId());
Assert.assertEquals("Lưu Diệc Phi",user.getName());
Assert.assertTrue(user.getFlag());
}
publicvoidassertSecondUser(Useruser){
Assert.assertEquals(Integer.valueOf(300),user.getId());
Assert.assertEquals("Lưu Thi Thi",user.getName());
Assert.assertFalse(user.getFlag());
}
}
2, ResultSetExtractor Mockito thí nghiệm
( 1 ) sáng tạo User thật thể
importlombok.Data;
@Data
publicclassUser{
privateIntegerid;
privateStringname;
privateStringapplicant;
privateStringaddress;
privateBooleanflag;
}
( 2 ) JdbcTemplate nghiệp vụ số hiệu
publicList<User>getUsers2(Stringsql,Stringname,Stringaddress){
returnjdbcTemplate.query(sql,newResultSetExtractor<List<User>>(){
@Override
publicList<User>extractData(ResultSetrs)throwsSQLException,DataAccessException{
List<User>userList=newArrayList<>();
while(rs.next()){
Useruser=newUser();
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);
}
returnuserList;
}
},name,address);
}
( 3 ) Junit thí nghiệm
@Test
publicvoidtest2(){
Mockito.when(jdbcTemplate.query(
ArgumentMatchers.anyString(),ArgumentMatchers.any(ResultSetExtractor.class),ArgumentMatchers.any()))
.thenAnswer((invocation)->{
ResultSetExtractor<List<User>>resultSetExtractor=
(ResultSetExtractor<List<User>>)invocation.getArgument(1);
ResultSetrs=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("Lưu Diệc Phi","Lưu Thi Thi");
Mockito.when(rs.getBoolean(ArgumentMatchers.eq("Flag")))
.thenReturn(true,false);
returnresultSetExtractor.extractData(rs);
});
List<User>users=insertGroup.getUsers2("sql","1","2");
Assert.assertEquals(Integer.valueOf(412),users.get(0).getId());
Assert.assertEquals("Lưu Diệc Phi",users.get(0).getName());
Assert.assertTrue(users.get(0).getFlag());
}