Ausdrückliche Lokalen EJB-nicht injiziert mit Arquillian
Benutze ich Arquillian zum testen einer stateless session-bean, die eine explizite lokale und remote-Schnittstelle. Aber in den Arquillian test nicht "injizieren" alles in einem Feld, das den Typ der lokalen Schnittstelle, aber es funktioniert für die remote-Schnittstelle.
@Stateless
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote {
public String greet() {
return "hallo";
}
}
Den remote-interface:
@Remote
public interface TestServiceRemote {
public String greet();
}
Locale-Schnittstelle:
@Local
public interface TestServiceLocal {
public String greet();
}
- Und dies ist der test:
@RunWith(Arquillian.class)
public class GenericEntityDaoEjbIntegrationTest {
@Deployment
public static JavaArchive createTestArchive()
throws UnsupportedEncodingException {
return ShrinkWrap.create(JavaArchive.class, "test.jar")
.addClasses(
TestServiceLocal.class,
TestServiceRemote.class,
TestServiceImpl.class);
}
@EJB
private TestServiceLocal testServiceLocal;
@EJB
private TestServiceRemote testServiceRemote;
//Will Fail
@Test
public void testTestServiceLocal() {
assertNotNull(this.testServiceLocal);
}
//Success
@Test
public void testTestServiceRemote() {
assertNotNull(this.testServiceRemote);
}
}
Ich bin mit arquillian-glassfish-embedded-1.0.0.CR2 -, glassfish-embedded-all 3.1 und arquillian-junit-container 1.0.0.CR5 Den relevanten Teil meiner pom ist:
<!-- arquillian test -->
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<version>1.0.0.CR5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-container-spi</artifactId>
<version>1.0.0.CR5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-glassfish-embedded-3.1</artifactId>
<version>1.0.0.CR2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
Dies ist die für Sie relevanten Teil der log-Datei (Sie enthält keine Ausnahme):
10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome
INFO: Portable JNDI names for EJB TestServiceImpl : [java:global/test/TestServiceImpl!de.test.service.TestServiceRemote, java:global/test/TestServiceImpl!de.test.service.TestServiceLocal]
10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome
INFO: Glassfish-specific (Non-portable) JNDI names for EJB TestServiceImpl : [de.test.service.TestServiceRemote, de.test.service.TestServiceRemote#de.test.service.TestServiceRemote]
10.04.2012 15:38:16 com.sun.enterprise.web.WebApplication start
INFO: WEB0671: Loading application [test] at [/test]
10.04.2012 15:38:16 org.glassfish.deployment.admin.DeployCommand execute
INFO: test was successfully deployed in 11.844 milliseconds.
Was ist mein Fehler? Was muss ich ändern, das eine Instanz injiziert Gebietsschema-Schnittstelle zu?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie verwenden eine der folgenden:
Hinzufügen
beans.xml
- Datei für die Bereitstellung:Dadurch können die CDITestEnricher von Arquillian, die weit mehr fähig ist als die EJBTestEnricher. Es kann mit
@Inject
Anmerkungen (offensichtlich), aber auch@Resource
und@EJB
Anmerkungen (siehe den Abschnitt über die Ressourcen-injection-CDI-spec). Die container dann behandelt sowohl die@EJB
annotierten Felder in der test-Instanz der Klasse als Punkte Injektion und injiziert Abhängigkeiten.Geben Sie die
mappedName
Eigenschaft für die@EJB
annotation für das Feld mit der portable JNDI-Namen der bean bereitgestellt. In deinem Fall wird es so Aussehen:Müssen Sie sicherstellen, dass die portable JNDI-Namen ist die gleiche wie die, die man erzeugt, für die Bereitstellung. Ich habe lediglich angegeben das eine, die generiert wurde, für meine "com.acme.TestServiceLocal" - Schnittstelle.
Zusätzlich zu den Antworten, die Sie müssen auch sicherstellen, dass Sie verwenden die richtige
@Deployment
Einstellung korrekt ist. Injizieren lokal müssen Sie sicherstellen, dass Sie@Deployment(testable=true)
(beachten Sie, dass dies ist der Standard).Vom Aquillian docs:
Diese nicht helfen, die OP (Sie hatte den richtigen Einstellungen) aber ich hoffe, es hilft denen, die Ankunft von Google, wie ich es Tat.
Versuchen zu ändern TestServiceImpl->TestServiceBean
es sieht aus, dass die embedded-glassfish-spezifische Anforderungen haben zu bean-name