2016-06-10 2 views
0

У меня есть абстрактный GenericDAO с общими методами для всех сущностей. Я использую Spring и Hibernate проекта. Исходный код GenericDAO является:Общепринятая практика тестирования DAO

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 Я не могу создать «Generic Entity», потому что у каждого объекта нет нулевых полей, которые я должен установить. Поэтому я думаю, что это невозможно сделать.

@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

Если GenericDAOImpl простая обертка Hibernate Session и вы вынуждены создавать тесты для этой реализации, то я бы предложил создать очень простой объект и соответствующие реализации Вашего GenericDAOImpl для указанного лица.

Например:

@Entity 
public class BasicTestEntity { 
    @Id @GeneratedValue private Integer id; 
    private String name; 
} 

public class BasicTestEntityDao 
    extends GenericDaoImpl<BasicTestEntity, Integer> { 
} 

Если вы обнаружили, что есть определенные ситуации, в которых вам нужно более четкие тесты для этого слоя, просто добавьте их и проверить их с помощью фиктивных/простой классов.

Ничто здесь не должно быть связано с вашими реальными сущностями, которые вы используете на более высоких уровнях кода. Этот тип тестирования будет проходить с интеграционными и модульными испытаниями для этих конкретных модулей и слоев.

+0

Возможно, это лучшее решение. Благодаря! – angeldev