如何为自定义 spring 批处理 reader 编写 junits
How to write junits for custom spring batch reader
下面是我的自定义Spring批次Reader。我必须编写涵盖 setPreparedStatementSetter()
和 setRowMapper()
方法的 junits。无论我尝试什么,我的单元测试都不会覆盖这些方法中的代码。有人可以指点我如何为这种匿名方法编写 junit 吗?谢谢。
PS:我知道 junits 并不是为了测试特定于框架的实现方法而编写的,但我需要它来覆盖我的代码。
public class MyDataReader extends JdbcCursorItemReader<ABC> {
public MyReader(DataSource dataSource, String beginTime, String endTime) {
setSql(QUERY);
setPreparedStatementSetter(new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
// Set parameters on the SQL query
ps.setLong(1, Long.parseLong(beginTime.trim()));
ps.setLong(2, Long.parseLong(endTime.trim()));
}
});
setDataSource(dataSource);
setRowMapper((ResultSet rs, int rowNum) -> {
ABC abc = new ABC();
abc.setDateTime(getLongOrNull("DT", rs));
abc.setStmt(getBooleanOrNull("SP", rs));
return abc;
});
}
}
您可以为 RowMapper
和 PreparedStatementSetter
创建一个 class,然后对它们进行单元测试。这是行映射器的示例:
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class ABCRowMapper implements RowMapper<ABC> {
@Override
public ABC mapRow(ResultSet rs, int rowNum) throws SQLException {
ABC abc = new ABC();
abc.setDateTime(rs.getLong("DT"));
abc.setStmt(rs.getBoolean("SP"));
return abc;
}
}
以及相应的测试:
import java.sql.ResultSet;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class ABCRowMapperTest {
@Test
public void testABCRowMapper() throws Exception {
// given
ABCRowMapper rowMapper = new ABCRowMapper();
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.getLong("DT")).thenReturn(1L);
Mockito.when(resultSet.getBoolean("SP")).thenReturn(true);
// when
ABC abc = rowMapper.mapRow(resultSet, 1);
// then
Assert.assertNotNull(abc);
Assert.assertEquals(abc.getDateTime(), 1L);
Assert.assertTrue(abc.getStmt());
}
}
希望对您有所帮助。
下面是我的自定义Spring批次Reader。我必须编写涵盖 setPreparedStatementSetter()
和 setRowMapper()
方法的 junits。无论我尝试什么,我的单元测试都不会覆盖这些方法中的代码。有人可以指点我如何为这种匿名方法编写 junit 吗?谢谢。
PS:我知道 junits 并不是为了测试特定于框架的实现方法而编写的,但我需要它来覆盖我的代码。
public class MyDataReader extends JdbcCursorItemReader<ABC> {
public MyReader(DataSource dataSource, String beginTime, String endTime) {
setSql(QUERY);
setPreparedStatementSetter(new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
// Set parameters on the SQL query
ps.setLong(1, Long.parseLong(beginTime.trim()));
ps.setLong(2, Long.parseLong(endTime.trim()));
}
});
setDataSource(dataSource);
setRowMapper((ResultSet rs, int rowNum) -> {
ABC abc = new ABC();
abc.setDateTime(getLongOrNull("DT", rs));
abc.setStmt(getBooleanOrNull("SP", rs));
return abc;
});
}
}
您可以为 RowMapper
和 PreparedStatementSetter
创建一个 class,然后对它们进行单元测试。这是行映射器的示例:
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class ABCRowMapper implements RowMapper<ABC> {
@Override
public ABC mapRow(ResultSet rs, int rowNum) throws SQLException {
ABC abc = new ABC();
abc.setDateTime(rs.getLong("DT"));
abc.setStmt(rs.getBoolean("SP"));
return abc;
}
}
以及相应的测试:
import java.sql.ResultSet;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class ABCRowMapperTest {
@Test
public void testABCRowMapper() throws Exception {
// given
ABCRowMapper rowMapper = new ABCRowMapper();
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.getLong("DT")).thenReturn(1L);
Mockito.when(resultSet.getBoolean("SP")).thenReturn(true);
// when
ABC abc = rowMapper.mapRow(resultSet, 1);
// then
Assert.assertNotNull(abc);
Assert.assertEquals(abc.getDateTime(), 1L);
Assert.assertTrue(abc.getStmt());
}
}
希望对您有所帮助。