Если бы мне нужно было проверить поведение класса в отношении его семантики типов, я бы пошел для проверки инвариантов типов. Другими словами, попытайтесь установить некоторые утверждения, которые верны для всех комбинаций типов, не только тех, которые вы ожидаете использовать, но и любого типа во вселенной, включая те, которые еще не изобретены. Например:
private <K, E> void testTypes(K k, E e) {
JpaDao<K, E> dao = new JpaDaoImpl<K, E>();
dao.persist(e);
assertEquals(dao.getById(e.getId()).getClass(), e.getClass());
}
@Test
public void testIntegerAndOrder() {
this.<Integer, Order>testTypes(10, new Order());
}
Понимаете, независимо от того, какие типы K
и E
, предположения должны сохраняться (метод testIntegerAndOrder()
проверяет это утверждение с использованием значений конкретного типа).
Это, конечно, следует использовать в сочетании с модульными тестами, которые фактически проверяют поведение для некоторых конкретных значений переменных типа. Это были бы те же самые модульные тесты, которые вы можете найти в любом руководстве по JUnit. Что-то в духе:
@Test
public void testDao() throws Exception {
JpaDao<Integer, Order> dao = getDao();
Order order = ...;
order.setId(10);
dao.persist(order);
assertEquals(order, dao.findById(10));
}
Посмотрите, как отличается семантика утверждений: в этом тесте проверяется утверждение, что хранимый объект хранит свой идентификатор, используя конкретное значение идентификатора переменной, а не переменную типа, как в предыдущем тесте.