Seam - Embedded Ejb - Logger
philippe.mercier May 22, 2007 11:00 AMHi everybody,
I use embedded-ejb with testng (tests are launch via maven2 - surefire).
All work fine !
Now i would like to use @Logger in my session bean as this :
@Stateless public class DossierManagerImpl implements DossierManagerLocal { @Logger private Log logger; @PersistenceContext private EntityManager em; /** * Constructeur vide */ public DossierManagerImpl() { } /** * Constructeur pour les tests * @param em */ public DossierManagerImpl(EntityManager em) { this.em = em; } /* * (non-Javadoc) * @see be.ucm.ss.comptaclient.c397.session.DossierManagerLocal#insert(be.ucm.ss.comptaclient.c397.entity.Dossier) */ public void insert(Dossier ccDossier) { logger.debug("insert dossier : nune = " + ccDossier.getNune()); em.persist(ccDossier); } /* * (non-Javadoc) * @see be.ucm.ss.comptaclient.c397.session.DossierManagerLocal#update(be.ucm.ss.comptaclient.c397.entity.Dossier) */ public void update(Dossier ccDossier) { em.merge(ccDossier); } /* * (non-Javadoc) * @see be.ucm.ss.comptaclient.c397.session.DossierManagerLocal#findAll() */ @SuppressWarnings("unchecked") public List<Dossier> findAll() { Query q = (Query) em.createQuery("from Dossier"); return q.getResultList(); } /* * (non-Javadoc) * @see be.ucm.ss.comptaclient.c397.session.DossierManagerLocal#findFromNune(java.lang.String) */ public Dossier findFromNune(String nune) { System.out.println(nune); Dossier dossier = em.find(Dossier.class, nune); return dossier; } }
but when my test class call the "insert" method of the session bean, i have an NullPointerException at the line that reference the logger.
here is my Test class :
package be.ucm.ss.comptaclient.c397.session; import java.util.List; import javax.persistence.EntityManager; import org.testng.annotations.Test; import be.ucm.ss.comptaclient.c397.entity.Dossier; import be.ucm.util.EmbeddedEjbHandler; @Test public class DossierManagerImplTest { public void testInsert() { EntityManager em = EmbeddedEjbHandler.getInstance().getEntityManager(); em.getTransaction().begin(); Dossier d = new Dossier(); d.setNune("1234567890"); d.setNumonss("123456789"); d.setDossiermaitre("12345"); d.setNumsuccu("123"); d.setGestionnairecompta("PHILOU"); d.setAdresseonss1("adr1"); d.setAdresseonss2("adr2"); d.setAdresseonss3("adr3"); d.setAdresseonss4("adr4"); d.setAdresseonss4("adr5"); d.setAdresseonss4("adr6"); d.setAdresseonss4("adr7"); d.setAdresseonss4("adr8"); DossierManagerImpl dmi = new DossierManagerImpl(em); dmi.insert(d); em.getTransaction().commit(); Dossier dossier = dmi.findFromNune(d.getNune()); assert dossier.getNune().equals(d.getNune()) : "test failed"; em.close(); } public void testFindAll() throws Exception { EntityManager em = EmbeddedEjbHandler.getInstance().getEntityManager(); em.getTransaction().begin(); System.out.println("testFindAll()"); DossierManagerImpl dmi = new DossierManagerImpl(em); List<Dossier> list = dmi.findAll(); assert list != null && !list.isEmpty(); em.getTransaction().commit(); em.close(); } public void testUpdate() { EntityManager em = EmbeddedEjbHandler.getInstance().getEntityManager(); em.getTransaction().begin(); System.out.println("testUpdate()"); DossierManagerImpl dmi = new DossierManagerImpl(em); Dossier dossier = dmi.findFromNune("1234567890"); // update dossier.setAdresseonss1("mon adresse"); em.merge(dossier); em.getTransaction().commit(); // reload & check dossier = dmi.findFromNune("1234567890"); assert dossier.getAdresseonss1().equals("mon adresse"); em.close(); } }
Than, my questions are :
1) how can i inject a reference to a logger in the session bean.
what is the best practice
2) in my session bean, i must add a constuctor for giving the entity manager and that only for test. Is there an alternative to do that ?
Thanks.