在Java中使用泛型为类编写的单元测试是什么?

Séb*_*nec 14 java generics unit-testing dao jpa

本文中JpaDao定义的类的非常具体的示例为例:

public abstract class JpaDao<K, E> implements Dao<K, E> {
    protected Class<E> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public JpaDao() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1];
    }

    public void persist(E entity) { entityManager.persist(entity); }

    public void remove(E entity) { entityManager.remove(entity); }

    public E findById(K id) { return entityManager.find(entityClass, id); }
}
Run Code Online (Sandbox Code Playgroud)

最好是为应用程序中的所有现有实体(Order,CustomerBook等)编写单元测试,还是只为一个实体编写单元测试是可以接受的,正如另一个问题所暗示的那样?有关使用泛型的单元测试java类的最佳实践吗?

Mar*_*itt 6

您可以为子类化的实体编写一个抽象测试类.

例如:

public abstract class JpaDaoTest<K,E> {

    abstract protected E getEntity();
    abstract protected JpaDao getDAO();

    @Test
    public void testPersistCreatesEntity()
    {
         JpaDao dao = getDAO();
         dao.persist(getEntity());
         // assert
     }
}
Run Code Online (Sandbox Code Playgroud)

您通用类实现的契约应该能够像通用一样进行测试,假设getEntity()正确设置和关系依赖.

因此,通过为您的通用子类的所有测试用例继承此测试类,您可以免费获得测试.