2016-06-10 17 views
0

Ich habe eine abstrakte GenericDAO mit gemeinsamen Methoden für alle Entitäten. Ich benutze Spring und Hibernate das Projekt. Der Quellcode des GenericDAO ist:Best Practice Test generische 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); 
} 

ich eine genericDAOTest Klasse erstellt habe, diese generischen Methoden zu testen und müssen sie nicht in jedem Testfall verschiedener Einheiten wiederholen, aber ich finde nicht den Weg tun Sie das. Gibt es eine Möglichkeit zu vermeiden, diese generischen Methoden in jeder Klasse zu testen? Vielen Dank!

Ich verwende DBUnit, um DAO-Klassen zu testen. Für testShouldSaveCorrectEntity kann ich keine "Generische Entität" erstellen, da jede Entität keine Nullfelder hat, die ich festlegen muss. Also, ich denke, das ist unmöglich.

@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() { 

} 

} 

Antwort

1

Wenn Ihre GenericDAOImpl eine einfache Wrapper um ein Hibernate ist Session und Sie sind gezwungen, Tests für diese Umsetzung zu schaffen, dann würde ich vorschlagen, eine sehr grundlegende Einheit und eine entsprechende Umsetzung Ihrer GenericDAOImpl für das Unternehmen zu schaffen.

Zum Beispiel:

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

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

Wenn Sie feststellen, Sie haben bestimmte Situationen, in denen Sie mehr explizite Tests für diese Schicht benötigen, sie einfach hinzufügen und testen sie Mock/einfache Klassen verwenden.

Nichts hier muss mit Ihren tatsächlichen realen Entitäten gebunden werden, die Sie in höheren Ebenen Ihres Codes verwenden. Diese Art von Tests wird mit Integrations- und Komponententests für diese spezifischen Module und Layer durchgeführt.

+0

Wahrscheinlich ist dies die beste Lösung. Vielen Dank! – angeldev