Tests des EJB avec EjbUnit
Bonjour,
Je suis en régie chez un client qui veut intégrer des tests unitaires à une application existante développée avec Seam (2.0.1.GA) et Maven. :(
L'application est stable.
Néanmois étant plus ou moins débutant avec le framework Seam je me heurte à quelques difficultés quant à l'intégration des tests sur les EJB.
J'ai opté pour le framework EjbUnit pour réaliser mes tests.
Les tests simples fonctionnent:
Mon Bean Session
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
@Stateless(name="CoreBizForkManager")
@Remote(CoreBizForkManagerRemote.class)
@Local(CoreBizForkManagerLocal.class)
public class CoreBizForkManagerBean implements CoreBizForkManagerRemote, CoreBizForkManagerLocal {
// Logger
private static Logger logger = Logger.getLogger(CoreBizForkManagerBean.class);
// Entity manager factory
@PersistenceUnit(unitName = "ForkUnit")
private EntityManagerFactory factory;
// Meal manager
@EJB(name="CoreBizMealManager/local")
private CoreBizMealManagerLocal mealManager;
/**
* @see com.fork.core.biz.CoreBizForkManagerRemote#findForkByID(java.lang.String)
*/
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public CoreDaoFork findForkByID(final String ID) throws FrameworkException,
CoreBizUnknownForkException {
BusinessLogicHelper action = new BusinessLogicHelper() {
@Override
protected Object execute(PersistenceManager manager) throws FrameworkException {
if (ID == null)
throw new FrameworkException("'forkID' is null");
// Prepare query
Query query = manager.createNamedQuery("CoreFindForkByID");
query.setParameter("ID", ID);
try {
CoreDaoFork fork = (CoreDaoFork) query.getSingleResult();
if (logger.isDebugEnabled())
logger.debug("Found fork " + ID);
return fork;
} catch (NoResultException e) {
throw new CoreBizUnknownForkException(ID);
} catch (NonUniqueResultException e) {
logger.error("Found multiple forks for ID " + ID, e);
throw new FrameworkException("Found multiple forks for ID " + ID);
}
}
};
return (CoreDaoFork) action.executeAction(factory);
}
.....
} |
Ma classe de tests:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
public class CoreBizForkManagerBeanTest extends
BaseSessionBeanFixture<CoreBizForkManagerBean> {
private static final Class<?>[] usedBeans = { CoreDaoMeal.class, CoreDaoFork.class, CoreDaoMealConfig.class, CoreDaoEvent.class, UsrDaoUser.class, UsrDaoRole.class, CoreDaoForkConfig.class};
private EntityManagerFactory factory;
@BeforeClass
public void init() throws Exception{
factory = Persistence.createEntityManagerFactory("ForkUnit");
Context ctx = new InitialContext();
ctx.rebind("factory", factory);
}
public CoreBizForkManagerBeanTest() {
super(CoreBizForkManagerBean.class, usedBeans,
new CoreDaoForkEntityInitialDataSet());
}
public void testDependencyInjection() {
final CoreBizForkManagerBean coreBizForkManagerBean = this.getBeanToTest();
assertNotNull(coreBizForkManagerBean);
}
public void testQuery(){
Query query = getEntityManager().createQuery("SELECT f from Fork f");
assertTrue(query.getResultList().size() == 0);
}
} |
Mais dès que je m'attaque à la partie des méthodes faisant appel à l'entity manager en ajoutant la méthode suivante à ma classe de tests:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public void testLoadData(){
final CoreBizForkManagerBean coreBizForkManagerBean = this.getBeanToTest();
assertNotNull(coreBizForkManagerBean);
try {
coreBizForkManagerBean.findForkByID("1");
} catch (CoreBizUnknownForkException e) {
e.printStackTrace();
} catch (FrameworkException e) {
e.printStackTrace();
}
} |
J'obtiens l'erreur suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
java.lang.IllegalArgumentException: 'factory' is null
at com.framework.server.PersistenceManager.<init>(PersistenceManager.java:61)
at com.framework.server.PersistenceManager.<init>(PersistenceManager.java:51)
at com.framework.server.BizBean$BusinessLogicHelper.executeAction(BizBean.java:38)
at com.fork.core.app.CoreBizForkManagerBean.findForkByID(CoreBizForkManagerBean.java:86)
at com.fork.core.app.CoreBizForkManagerBeanTest.testLoadData(CoreBizForkManagerBeanTest.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:154)
at org.jmock.core.VerifyingTestCase.runBare(Unknown Source)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) |
Je vois que l'attribut factory de mon bean session n'est pas instancié.
Comment puis-je régler ce problème ?
Dois-je mocker cet attribut ? Si oui comment ?