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 : 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);
	}
.....
}
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
 
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 : 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();
		}
	}
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
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 ?