【问题标题】:How to unit test old legacy application如何对旧的遗留应用程序进行单元测试
【发布时间】:2014-02-14 15:00:05
【问题描述】:

我被分配到旧的Web应用程序(JSF 1.2 + Eclipselink),没有像EJB或Spring这样的中间件,应用程序的服务层由直接调用EntityManager的POJO组成。代码的结构是这样的 SomeBean(backing bean) -> SomeServices(这里是业务逻辑和数据访问代码的混合),没有单独的 DAO 层。服务类的代码通常是这样的(这里非常简化):

 public void someMethod(SomeEntity someEntity, ....) throws SomeServiceExeption {
    try{
        entitiyManager.getTransaction.begin();
        //lotOfLogicHereAndCallingSomeOtherPrivateMethods
        entitiyManager.getTransaction.commit();
        }catch(Exception e){
            log.error("");
            if(entitiyManager.getTransaction..isActive()){
                entitiyManager.getTransaction.rollback();
            }
        throw new SomeServiceExeption(e);
    }
}

这个应用程序只有很少的测试,几乎没有测试任何东西,所以我试图用单元测试覆盖尽可能多的代码(会有一些更改提交到应用程序中,这将需要对遗留代码进行大量更改不在测试范围内)。我的问题是你将如何对这样的代码进行单元测试。我有三个想法:

  1. 重构测试。我可以引入 DAO 层并将所有 entityManager 在那里调用。但是没有测试的重构总是 问题。
  2. 模拟实体管理器。我用 EasyMock 尝试了几次,它有效 并帮助我至少有一些代码覆盖率 需要更改,但可能不是很好的风格,因为你不应该 不属于你的 mock api。此外,准备 EntityManager 模拟需要大量时间和代码
  3. 使用 hsqldb 或 h2 进行集成测试,而不是单元测试 和一些虚拟测试数据。那么这可能需要大部分 工作和测试会很慢。我也想主要覆盖 业务逻辑,而不是数据访问。

【问题讨论】:

  • 如果还没有,先去购买Working Effectively with Legacy Code
  • 谢谢,我会看的,看起来很有前途。
  • 作为对选项 3 的评论:在内存中,像 h2 这样的数据库通常是“快的”,但您需要提供一些测试数据。如果您已经在其他数据库中拥有此数据,则可以使用该数据或针对该数据库进行测试。一开始执行会很慢,但它会启动重构和编写单元测试过程。

标签: java unit-testing testing


【解决方案1】:

我可能会首先添加一些集成测试并覆盖您想要重构的部分。然后,您可以继续重构为更独立的可单独测试的单元。如果重构正确,您就可以将业务逻辑与存储分开进行单元测试。

进行一些集成测试总是一个好主意,因此这是一个很好的起点。

无论如何,我不会重构任何测试未涵盖的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多