单元测试服务层,它使用hibernate和注释,并且没有DAO



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

@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作为方法参数传入。

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

这个类是DAO,除非你有很多逻辑,否则嘲笑Session等不会有太多好处——如果你有,那么它可能更好地放在实际的服务类或模型本身中。

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

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

@Service("fooService")
public class FooService {
  private SessionFactory sessionFactory;
  @Resource(name = "sessionFactory")
  public void setSessionFactory(SessionFactory sessionFactory) {
     this.sessionFactory = sessionFactory;
  }
}

我认为您有几件事需要决定:

  • 无论您是否将sessionFactory作为字段。我想你应该这样做
  • 是使用构造函数还是setter注入。我更喜欢构造函数注入
  • 你将如何模拟SessionFactory:手写,使用Mockito,EasyMock。。。不管你喜欢什么

最新更新