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

Posted

技术标签:

【中文标题】用jmockit模拟扩展类的抽象方法【英文标题】:mock abstract method of extended class with jmockit 【发布时间】:2014-02-06 16:09:37 【问题描述】:

我的 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

我的问题是,我是否可以在不更改此处final String lSql = readSqlQuery("LAD"); 的生产代码的情况下包含测试 sql(LAD_TEST) 而不是真正的生产 sql(LAD) ???

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

我的测试电话:

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

有没有办法在不模拟 mDogDao 的情况下使用 jmockit 来管理这个?

一些建议? 谢谢 斯蒂芬

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

我总是针对单独的单元测试数据库架构或内存数据库工作。这样我就可以确定我的查询中的错误不会影响其他人使用的数据。

即使您需要一定数量的测试数据,您也可以随时在测试之前插入数据的提取,然后再进行清理。

此外,通过这种方式,您的单元测试也可以单独运行。如果一个测试修改了数据,您的其他测试不会受到可能的后果。

【讨论】:

它是一个事务测试类,默认回滚=true,此外还有测试数据库。我不影响任何其他开发者。

以上是关于用jmockit模拟扩展类的抽象方法的主要内容,如果未能解决你的问题,请参考以下文章

测试扩展另一个类的抽象类

PHPUnit 模拟一个抽象类的所有方法

查看一个抽象类的方法是否未被其中一个扩展类覆盖的方法

使用 findAll() 方法时如何避免休眠创建抽象类的对象?

C#中的抽象类抽象方法和虚方法

设计模式之创建型抽象工厂模式