Problem with @EJB injection
str Jun 3, 2010 9:28 AMHi, first i just want to say I really like this project and I think it will become verry populare.
Now for the problems.
I'm trying to EJB into a test this works fine until the EJB implements a local interface. Then verry stange problems. All my tests pass, even if they shouldn't.
The test
import javax.ejb.EJB; import org.jboss.arquillian.api.Deployment; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.impl.base.asset.ByteArrayAsset; import org.testng.Assert; import org.testng.annotations.Test; public class TemperatureConverterTest extends Arquillian { @EJB private TemperatureConverter converter; @Test public void testConvertToCelsius() { Assert.fail(); Assert.assertEquals(converter.convertToCelsius(32d), 0d); Assert.assertEquals(converter.convertToCelsius(212d), 100d); } @Test public void testConvertToFarenheit() { Assert.assertEquals(converter.convertToFarenheit(0d), 32d); Assert.assertEquals(converter.convertToFarenheit(100d), 212d); } @Deployment public static JavaArchive createTestArchive() { JavaArchive ja = ShrinkWrap.create("test6.jar", JavaArchive.class) .addClass(TemperatureConverter.class) .addClass(TemperatureConverterImpl.class) .addManifestResource(new ByteArrayAsset(new byte[0]), ArchivePaths.create("beans.xml")); System.out.println(); System.out.println("Printing classes"); System.out.println(); ja.toString(Formatters.SIMPLE); System.out.println(); return ja; } }
The EJB
import javax.ejb.Local; import javax.ejb.Stateless; @Local(TemperatureConverter.class) @Stateless public class TemperatureConverterImpl implements TemperatureConverter { public double convertToCelsius(double f) { return ((f - 32) * 5 / 9); } public double convertToFarenheit(double c) { return ((c * 9 / 5) + 32); } }
The interface
public interface TemperatureConverter { public double convertToCelsius(double f); public double convertToFarenheit(double c); }
I try
Removing the interface and just injecting the EJB the first test fail like i should.
The test
import javax.ejb.EJB; import org.jboss.arquillian.api.Deployment; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.impl.base.asset.ByteArrayAsset; import org.testng.Assert; import org.testng.annotations.Test; public class TemperatureConverterTest extends Arquillian { @EJB private TemperatureConverterImpl converter; @Test public void testConvertToCelsius() { Assert.fail(); Assert.assertEquals(converter.convertToCelsius(32d), 0d); Assert.assertEquals(converter.convertToCelsius(212d), 100d); } @Test public void testConvertToFarenheit() { Assert.assertEquals(converter.convertToFarenheit(0d), 32d); Assert.assertEquals(converter.convertToFarenheit(100d), 212d); } @Deployment public static JavaArchive createTestArchive() { JavaArchive ja = ShrinkWrap.create("test6.jar", JavaArchive.class) .addClass(TemperatureConverter.class) .addClass(TemperatureConverterImpl.class) .addManifestResource(new ByteArrayAsset(new byte[0]), ArchivePaths.create("beans.xml")); System.out.println(); System.out.println("Printing classes"); System.out.println(); ja.toString(Formatters.SIMPLE); System.out.println(); return ja; } }
The EJB
import javax.ejb.Local; import javax.ejb.Stateless; @Stateless public class TemperatureConverterImpl { public double convertToCelsius(double f) { return ((f - 32) * 5 / 9); } public double convertToFarenheit(double c) { return ((c * 9 / 5) + 32); } }
Do any of you have any idea? I appreciate all help nad again great projekt.
/Stefan