用jmockit模拟扩展类的抽象方法

时间:2014-02-06 16:09:37

标签: java junit jmockit

我的Dao类里面有一个像这样的方法:

  @Override
  public List<Dog> loadAllDog(Date pDate) {
    final MapSqlParameterSource lParameterSource = new MapSqlParameterSource();
    lParameterSource.addValue("jdate", pDate);

    final String lSql = readSqlQuery("LAD");
    final NamedParameterJdbcTemplate lTemplate = createNamedParameterJdbcTemplate();

    return lTemplate.query(lSql, lParameterSource, new DogExtractor());
  }

我使用上面的方法加载集成测试的数据。不幸的是,结果列表的大小约为300000个数据行。

对于我的测试,只能处理100个数据行。所以我写了一个只返回100行的SQL测试文件(Key LAD_TEST):

SELECT 
*
FROM 
DOG
WHERE 
TO_CHAR(sell, 'dd.mm.yy') = TO_CHAR(:jdate,'dd.mm.yy')
and rownum <= 100

我的问题是,无论如何我可以包括测试sql(LAD_TEST)而不是真正的生产sql(LAD)而不改变生产代码final String lSql = readSqlQuery("LAD"); ???

我在我的测试类中使用jmockit,但我所说的dao类(mDogDao)并没有被嘲笑......

来自我的测试的电话:

List<Dog> lAllDog = mDogDao.loadAllDog(lNow.getTime());

有没有办法用jmockit管理它而不模仿mDogDao?

一些建议? 谢谢 斯蒂芬

2 个答案:

答案 0 :(得分:0)

您可以模拟NamedParameterJdbcTemplate类,并记录期望,以便query(...)方法返回您想要的测试数据。

答案 1 :(得分:0)

为什么要在单元测试中查询实时数据库?

我一直在做的是针对单独的单元测试数据库模式或内存数据库。这样我就可以确定查询中的错误不会影响其他人使用的数据。

即使您需要一定数量的测试数据,您也可以在测试之前插入数据摘录并在之后进行清理。

此外,您的单元测试也可以单独运行。如果一个测试修改了数据,那么您的其他测试不会受到可能后果的影响。