[英]JDBC Spring Mockito
我想测试此方法(getDetails)是我的DaoImpl的一部分,但我不知道该怎么做。 我知道我必须测试使用JDBC模板模拟它的数据库:
public List<DataLoadDetail> getDetails(int fileId, String templateType, String status, int start, int end) {
List<DataLoadDetail> list = new ArrayList<DataLoadDetail>();
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM ( ")
.append("SELECT ROW_NUMBER() OVER(ORDER BY TB_DETAIL.UPLOADITEM_SEQ_NR ASC) AS RowNum, ")
.append("TB_DETAIL.UPLOAD_ID, TB_DETAIL.UPLOADITEM_SEQ_NR, TB_DETAIL.UPLOADITEM_ACTION_CD, ")
.append("TB_DETAIL.UPLOADITEM_INSERT_DT, TB_DETAIL.UPLOADITEM_UPDATE_DT, TB_DETAIL.UPLOADITEM_STATUS_CD, ")
.append("TB_DETAIL.UPLOADITEM_PAYLOAD, TB_DETAIL.UPLOADITEM_RESPONSE, TB_MESSAGE.DESCRIPTION ")
.append("FROM DL_DETAIL TB_DETAIL LEFT JOIN DL_MESSAGE TB_MESSAGE ")
.append("ON TB_DETAIL.UPLOAD_ID = TB_MESSAGE.UPLOAD_ID ")
.append("AND TB_DETAIL.UPLOADITEM_SEQ_NR = TB_MESSAGE.UPLOADITEM_SEQ_NR ")
.append("WHERE TB_DETAIL.UPLOAD_ID =:fileId ");
if (StringUtils.equalsIgnoreCase(status, "s")) {
sql.append(" AND TB_DETAIL.UPLOADITEM_STATUS_CD = 'S' ");
} else if (StringUtils.equalsIgnoreCase(status, "f")) {
sql.append(" AND TB_DETAIL.UPLOADITEM_STATUS_CD != 'S' ");
}
sql.append(" ) AS DT WHERE RowNum > :start ");
if (end > 0) {
sql.append(" AND RowNum <= :end ");
}
System.out.println("getDetails - File Id "+fileId+", Query --> " + sql.toString());
Map<String, Object> props = new HashMap<String, Object>();
props.put("fileId", fileId);
props.put("start", start);
props.put("end", end);
list = npTemplate.query(sql.toString(), props, new DataLoadDetailRowMapper());
return list;
}
applicationContext.xml文件是:
<bean id="dataLoadDetailDao" class="com.hp.it.mdm.dao.impl.DataLoadDetailDaoImpl">
<property name="npTemplate">
<ref bean="nameParamJdbcTemplate"/>
</property>
<property name="dlmdao">
<ref bean="dlmdao"/>
</property>
</bean>
我已经在StackOverflow中看到了几篇文章,但是我无法获得测试的概念。
问候。
您可以做的是verify
使用指定的参数调用了方法npTemplate.query()
。
您的测试可能如下所示:
private NameParamJdbcTemplate nTemplate = mock(NameParamJdbcTemplate.class);
@Test
public void test() {
//given
private DaoImpl daoImpl = new DaoImpl(nTemplate);
//when
daoImpl.getDetails(...);
//then
verify(nTemplate).query(any(), any(), any()); //or you can specify the exact parameters that should be passed.
}
根据您要测试的内容,可能会有不同类型的测试。
首先,您需要测试该方法的逻辑。 您的代码的每个分支都必须经过测试(如果有条件,则有几个条件)。 要实现这一点,您必须模拟npTemplate.query()
方法,以传递sql查询字符串和参数的不同组合。 您所有的测试看起来都是这样
// given
String expectedSql =
Map<String, Object> expectedProps = ...
DataLoadDetailRowMapper expectedMapper = new DataLoadDetailRowMapper();
List<DataLoadDetail> expectedResult = ...
NpTemplate npTemplate = Mockito.mock(NpTemplate.class);
BDDMockito.given(npTemplate.query(expectedSql, props, expectedMapper))
.willReturn(expectedResult);
DaoImpl dao = ... // Initialize it using the mocked npTemplate.
// when
List<DataLoadDetail> result = dao.getDetails(); // pass needed parameters
// then
assertThat(result, is(expectedResult));
我并没有使用静态导入只是为了弄清楚使用了哪些类。 但是最好在单元测试中静态导入所有内容。
第二件事是查询本身,您必须测试sql代码。 为此,您可以使用内存数据库(例如H2)进行数据设置,并在其上运行sql。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.