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
Ma classe de tests:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } ..... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
J'obtiens l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
Je vois que l'attribut factory de mon bean session n'est pas instancié.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Comment puis-je régler ce problème ?
Dois-je mocker cet attribut ? Si oui comment ?
Partager