繁体   English   中英

JDBC Spring Mockito

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM