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

2022-09-03 07:43:00

本文中定义的类的非常具体的示例为例: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); }
}

最好是为应用程序中的所有现有实体(,,Book等)编写单元测试,还是像另一个问题所暗示的那样,只为一个实体编写单元测试是可以接受的?关于使用泛型对 Java 类进行单元测试,是否有任何最佳实践?OrderCustomer


答案 1

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

例如:

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
     }
}

泛型类实现的协定应该能够像一般一样进行测试,假设设置和关系依赖关系正确。getEntity()

因此,通过为泛型子类的所有测试用例子类子类化此测试类,可以免费获得测试。


答案 2

如果使用不同的实体类型导致执行不同的代码,则需要一个单独的测试用例。

我会在一组仅使用一种实体类型的常见测试中尽可能多地进行测试。如果大多数代码对所有实体都一视同仁,则无需多次测试。我会为特定实体DAO具有不同行为所需的任何特殊行为设置单独的测试用例。


推荐