【发布时间】: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);
}
}
这个应用程序只有很少的测试,几乎没有测试任何东西,所以我试图用单元测试覆盖尽可能多的代码(会有一些更改提交到应用程序中,这将需要对遗留代码进行大量更改不在测试范围内)。我的问题是你将如何对这样的代码进行单元测试。我有三个想法:
- 重构测试。我可以引入 DAO 层并将所有 entityManager 在那里调用。但是没有测试的重构总是 问题。
- 模拟实体管理器。我用 EasyMock 尝试了几次,它有效 并帮助我至少有一些代码覆盖率 需要更改,但可能不是很好的风格,因为你不应该 不属于你的 mock api。此外,准备 EntityManager 模拟需要大量时间和代码
- 使用 hsqldb 或 h2 进行集成测试,而不是单元测试 和一些虚拟测试数据。那么这可能需要大部分 工作和测试会很慢。我也想主要覆盖 业务逻辑,而不是数据访问。
【问题讨论】:
-
如果还没有,先去购买Working Effectively with Legacy Code
-
谢谢,我会看的,看起来很有前途。
-
作为对选项 3 的评论:在内存中,像 h2 这样的数据库通常是“快的”,但您需要提供一些测试数据。如果您已经在其他数据库中拥有此数据,则可以使用该数据或针对该数据库进行测试。一开始执行会很慢,但它会启动重构和编写单元测试过程。
标签: java unit-testing testing