Problems Getting Started
andygibson Feb 20, 2010 12:26 AMSo, after Dan mentioned Arquillian on a post regarding a Weld bug, I thought I'd take a look. I looked through Dan's example, the Demo in the source and the documentation. What I have, I think should work, but it isn't. Here's a run down of what I did.
Grabbed the source from subversion, mvn install 'd it, and created a new maven application.I'm trying it with JBoss 6 M2 which I grabbed the other day. Looking at the demo, you just need to add a couple of dependencies, and create a class which has a @Deployer annotated method returning a JavaArchive :
in src/main/java :
@Stateless public class MessengerBean { public static final String TEXT = "This is my EJB message"; public String getMessage() { return TEXT; } }
in src/test/java :
@RunWith(Arquillian.class) public class MessengerTest { @Deployment public static JavaArchive createDeployment() { return Archives.create("test.jar", JavaArchive.class).addClasses( MessengerBean.class); } @EJB private MessengerBean messengerBean; @Test public void testMessage() { Assert.assertNotNull(messengerBean); Assert.assertEquals(MessengerBean.TEXT + "df", messengerBean .getMessage()); //should fail } }
I defined my POM as :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>arqtest</groupId> <artifactId>arquillianapp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>arquillianapp</name> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>jboss-remote-60</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-jboss-remote-60</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> </profile> </profiles> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-junit</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.6</version> <scope>test</scope> </dependency> </dependencies> </project>
Initially, I had a lot of problems connecting to the container and then in the docs I see I need a jndi.properties with :
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=jnp://localhost:1099
So I add that, and now while it can now connect to the server I have other issues in that it can't inject the bean :
------------------------------------------------------------------------------- Test set: org.arqdemo.MessengerTest ------------------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.25 sec <<< FAILURE! testMessage(org.arqdemo.MessengerTest) Time elapsed: 0.766 sec <<< ERROR! java.lang.RuntimeException: Could not inject members at org.jboss.arquillian.testenricher.jboss.EJBInjectionEnricher.injectClass(EJBInjectionEnricher.java:69) at org.jboss.arquillian.testenricher.jboss.EJBInjectionEnricher.enrich(EJBInjectionEnricher.java:46) at org.jboss.arquillian.spi.util.TestEnrichers.enrich(TestEnrichers.java:43) at org.jboss.arquillian.impl.DeployableTestBuilder$InContainerContainer$1.invoke(DeployableTestBuilder.java:89) at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:129) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:101) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:115) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.junit.runner.JUnitCore.run(JUnitCore.java:159) at org.junit.runner.JUnitCore.run(JUnitCore.java:138) at org.jboss.arquillian.junit.JUnitTestRunner.execute(JUnitTestRunner.java:60) at org.jboss.arquillian.protocol.servlet.ServletTestRunner.doGet(ServletTestRunner.java:83) at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:336) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:276) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:872) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) at java.lang.Thread.run(Thread.java:619) Caused by: javax.naming.NameNotFoundException: MessengerBeanBean not bound at org.jnp.server.NamingServer.getBinding(NamingServer.java:771) at org.jnp.server.NamingServer.getBinding(NamingServer.java:779) at org.jnp.server.NamingServer.getObject(NamingServer.java:785) at org.jnp.server.NamingServer.lookup(NamingServer.java:396) at org.jnp.server.NamingServer.lookup(NamingServer.java:399) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:728) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:688) at javax.naming.InitialContext.lookup(InitialContext.java:392) at org.jboss.arquillian.testenricher.jboss.EJBInjectionEnricher.lookupEJB(EJBInjectionEnricher.java:89) at org.jboss.arquillian.testenricher.jboss.EJBInjectionEnricher.injectClass(EJBInjectionEnricher.java:63) ... 39 more
For some reason it is looking for MessengerBeanBean.
Overall though, it certainly does seem to fit the bill for making container unit testing as simple as plain old junit testing.
Cheers,
Andy