如何对遗留旧应用程序进行单元测试

时间:2014-02-14 15:00:06

标签: java unit-testing testing

我被分配到旧的web应用程序(JSF 1.2 + Eclipselink),没有像EJB或Spring这样的中间件,应用程序的服务层由直接调用EntityManager的POJO组成。代码的结构就像这样SomeBean(支持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多次尝试过,它可以工作 并帮助我至少有一些代码覆盖的代码 需要改变,但可能不是好的风格,因为你不应该 不属于你的模拟api。另外,准备EntityManager模拟需要大量的时间和代码
  3. 不使用单元测试,而是使用hsqldb或h2进行集成测试 和一些虚拟测试数据。那么这可能需要大部分时间 工作和测试会很慢。我也想大多报道 业务逻辑,而不是数据访问。

1 个答案:

答案 0 :(得分:0)

我可能会先添加一些集成测试,然后覆盖你想要重构的部分。然后,您可以继续重构更多可单独测试的独立单元。如果重构正确,您可以单独从存储中单独测试您的业务逻辑。

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

在任何情况下,我都不会重构任何测试未涵盖的代码。