测试通用DAO的最佳实践

时间:2016-06-10 16:48:48

标签: java hibernate generics testing dao

我有一个抽象的GenericDAO,其中包含所有实体的常用方法。我正在使用Spring和Hibernate这个项目。 GenericDAO的源代码是:

public abstract class GenericDAOImpl <T, PK extends Serializable> implements GenericDAO<T, PK> {

private SessionFactory sessionFactory;

/** Domain class the DAO instance will be responsible for */
private Class<T> type;

@SuppressWarnings("unchecked")
public GenericDAOImpl() {
    Type t = getClass().getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType) t;
    type = (Class<T>) pt.getActualTypeArguments()[0];
}

@SuppressWarnings("unchecked")
public PK create(T o) {
    return (PK) getSession().save(o);
}

public T read(PK id) {
    return (T) getSession().get(type, id);
}

public void update(T o) {
    getSession().update(o);
}

public void delete(T o) {
    getSession().delete(o);
}

我已经创建了一个genericDAOTest类来测试这些泛型方法,并且不必在不同实体的每个测试用例中重复它们,但是我找不到这样做的方法。有没有办法避免在每个类中测试这种通用方法?谢谢!

我正在使用DBUnit来测试DAO类。对于testShouldSaveCorrectEntity,我无法创建“通用实体”,因为每个实体都没有我必须设置的空字段。所以,我认为不可能这样做。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/com//spring/dao-app-ctx-test.xml")
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
    TransactionDbUnitTestExecutionListener.class})
@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public abstract class GenericDAOTest<T, PK extends Serializable> {
protected GenericDAO<T, PK> genericDAO;

public abstract GenericDAO<T, PK> makeGenericDAO();

@Test
@SuppressWarnings("unchecked")
public void testShouldGetEntityWithPK1() {
    /* If in the future exists a class with a PK different than Long, 
    create a conditional depending on class type */
    Long pk = 1l;

    T entity = genericDAO.read((PK) pk);
    assertNotNull(entity);
}

@Test
public void testShouldSaveCorrectEntity() {

}

}

1 个答案:

答案 0 :(得分:1)

如果你的GenericDAOImpl是围绕Hibernate Session的简单包装器,并且你被迫为这个实现创建测试,那么我建议你创建一个非常基本的实体和你的{的相应实现{1}}用于所述实体。

例如:

GenericDAOImpl

如果您发现某些情况需要对此图层进行更明确的测试,只需添加它们并使用mock / simple类进行测试。

这里的任何内容都不需要与您在更高级别的代码中使用的实际实体绑定。这种类型的测试将针对那些特定模块和层进行集成和单元测试。