User Arquillian to test restful service with Alternative CDI
casta_oh May 19, 2014 1:32 PMHi all.
I need to use arquillian to test one EJB @Stateless configured as restful service that has inside him one cdi inyection of a second EJB. This second EJB goes to osb and returns a list of strings. For my test, I don´t want to go to OSB because I want to isolate my test environment with other environments.
So, to achieve this I have managed to make an alternative of CDI for this second EJB in my test file. The CDI @Alternative returns always the same list string. In this way, I can test my EJB without depending the ways the EJB goes.
This works cool when I call the EJB with Arquillian and CDI inyection (without using @RunAsClient)
Sample code of my alternative:
@Produces
@AlternativeFactory
public XXXEJB produceIntervinientesMock() throws Exception {
IntervinientesEJB intervinientes = mock(IntervinientesEJB.class);
Sample code of my @Deployment:
@Deployment
public static Archive<?> createTestArchive() {
WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
.addClass(Logger.class)
.addClass(MiscResourceProducer.class)
.addClass(IntervinientesRS.class)
.addClass(AbstractBaseRS.class)
.addClass(JaxRsActivation.class)
.addClass(IntervinientesEJB.class)
.addAsWebInfResource("beans.xml");
System.out.println(war.toString(true));
return war;
}
The beans.xml has the alternative pre-configured (@AlternativeFactory).
Sample code of the test in which works the alternative:
@Test
public void getListIntervinientesSSOMockTest() throws BusinessException, Exception {
//CODE REMOVED
StringList list = intervinientesRS.getListIntervinientes(0);
Assert.assertNotNull(list);
}
The alternative works fine. I can access the EJB inyected via CDI and obtain the alternative.
The problem is when I want to test this, but in client mode. I want to access the EJB in client mode, and when the function goes to the EJB, obtain the @Alternative, instead of the proper EJB.
Questions are,
1. Is it possible? Alternative works in a test that is not @RunAsClient. I am calling outside the war.
2. If it is not possible, is well focused my approach?
Regards in advantaje.
The problem