使用hibernate和annotations的单元测试服务层,没有DAO

时间:2012-02-13 16:02:48

标签: java hibernate spring unit-testing integration-testing

以下单元测试/集成测试的最佳方法是什么:

@Service("fooService")
public class FooService {

  @Resource(name = "sessionFactory")
  private SessionFactory sessionFactory;

  /*** Get all **/
  @Transactional(readOnly = true)
  public List<Foo> getAllFoos() {
    final Session session = sessionFactory.getCurrentSession();
    final Criteria crit = session.createCriteria(Foo.class);
    return crit.list();
  }
}

我很高兴使用mockito,但不确定如何利用它的实用性。我见过的大多数情况都要求将dao / mock dao作为方法参数传入。

显然,我会推断更复杂的方法。

3 个答案:

答案 0 :(得分:2)

这个类是DAO,除非你有很多逻辑,否则没有太多可以从模拟Session等中获得 - 如果你这样做,那么可能更好地放在实际的服务类或模型本身。

想想你在这里要测试的是什么:这些方法是否从数据库中返回它们应该的内容。我会针对内存数据库运行集成测试。

答案 1 :(得分:1)

如果将@Resource注释放在方法上,那么设置测试并使用SessionFactory的模拟实现配置服务会更容易(如果这是您要求的)。

@Service("fooService")
public class FooService {

  private SessionFactory sessionFactory;

  @Resource(name = "sessionFactory")
  public void setSessionFactory(SessionFactory sessionFactory) {
     this.sessionFactory = sessionFactory;
  }

}

答案 2 :(得分:1)

我认为你有一些事情需要决定:

  • 是否将sessionFactory保留为字段。我想你应该。
  • 是否使用构造函数或setter注入。我更喜欢构造函数注入。
  • 你将如何模拟SessionFactory:手工编写,使用Mockito,EasyMock ......无论你喜欢哪种。