我在Java EE Web项目中实现的一个DAO类位于
下@Repository("ClientsimpleDAO")
public class ClientsimpleDAOImp implements ClientsimpleDAO {
private static final Log log = LogFactory.getLog(ClientsimpleDAOImp.class);
@PersistenceContext
EntityManager em;
@Override
public void delete(Clientsimple clientsimple) {
// TODO Auto-generated method stub
log.debug("removing clientsimple");
try{
em.remove(clientsimple);
log.debug("clientsimple removed");
}
catch(RuntimeException re){
log.error("clientsimple remove failure"+re);
}
}
@SuppressWarnings("unchecked")
@Override
public List<Clientsimple> findByEntreprise(String entreprise) {
// TODO Auto-generated method stub
log.debug("list Cli By entreprise");
try{
Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.entreprise= :entreprise");
q.setParameter(entreprise,entreprise);
List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
return cli;
}catch(RuntimeException re){
log.error(re);
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<Clientsimple> findByNom(String nom) {
// TODO Auto-generated method stub
log.debug("list Cli By nom");
try{
Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.nom= :nom");
q.setParameter(nom,nom);
List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
return cli;
}catch(RuntimeException re){
log.error(re);
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<Clientsimple> findByPrenom(String prenom) {
// TODO Auto-generated method stub
log.debug("list Cli By prenom");
try{
Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.prenom= :prenom");
q.setParameter(prenom,prenom);
List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
return cli;
}catch(RuntimeException re){
log.error(re);
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<Clientsimple> findByRegion(String region) {
// TODO Auto-generated method stub
log.debug("list Cli By region");
try{
Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.regioncli= :region");
q.setParameter(region,region);
List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
return cli;
}catch(RuntimeException re){
log.error(re);
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<Clientsimple> getALL() {
// TODO Auto-generated method stub
log.debug("list ALL Cli");
try{
Query q =em.createQuery("SELECT cli from Clientsimple cli");
List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
return cli;
}catch(RuntimeException re){
log.error(re);
return null;
}
}
@Override
public void save(Clientsimple clientsimple) {
// TODO Auto-generated method stub
log.debug("save clientsimple");
try{
em.persist(clientsimple);
log.debug("clientsimple saved");
}
catch(RuntimeException re){
log.error("clientsimple saving failure"+re);
}
}
@Override
public void update(Clientsimple clientsimple) {
// TODO Auto-generated method stub
log.debug("update clientsimple");
try{
em.merge(clientsimple);
log.debug("clientsimple merged");
}
catch(RuntimeException re){
log.error("clientsimple merging failure"+re);
}
}
}
所以,我不知道如何测试这个dao或其他?
我已经创建了一个主类来测试它,但它给了我一个错误(请参阅下面的图像包含代码和控制台中的错误)。
左图显示了我的项目层次结构(使用flex,spring,jpa,hibernate的技术);
答案 0 :(得分:2)
不要使用主类测试,使用Spring的测试框架。请阅读9.3 Integration testing部分中的相关内容。
让您的Test类继承自here所述的一个Spring支持类,例如: AbstractTransactionalJUnit4SpringContextTests
,添加上下文配置和一些依赖项并进行一些测试。很简单。
@ContextConfiguration("classpath:path/to/your/spring/context.xml")
public class YourServiceTest extends
AbstractTransactionalJUnit4SpringContextTests{
@Autowired
private YourDaoInterfaceHere dao;
// method is automatically transactional
@Test
public void testSomething(){
dao.persist(someData);
dao.load(someOtherData);
}
}
关键是
daoContext.xml
,但不是everythingContext.xml
)PropertyPlaceHolderConfigurer
或PropertyOverrideConfigurer
机制在测试和制作中使用不同的环境作为旁注:
catch(RuntimeException re){
log.error("clientsimple remove failure"+re);
}
你永远不应该记录这样的例外。您正在丢失堆栈跟踪。始终使用log.error(message, throwable)
版本。
答案 1 :(得分:0)
我们的团队也有这个整合问题。问题似乎是你不能真正单元测试类如此依赖于应用程序服务器/容器。
我们最终放弃了对DAO和EJB的单元测试,并使用集成测试对它们进行测试 - DAO的输出通过使用DAO的服务进行测试。
答案 2 :(得分:0)
您的主类没有启动Spring上下文,因此您的EntityManager为null。您必须加载Spring上下文,然后Spring将自动装配您的EntityManager。