[英]Explicite Local EJB not injected with Arquillian
我使用 Arquillian 来测试具有显式本地和远程接口的无状态 session bean。 但在测试中,Arquillian 不会在具有本地接口类型的字段中“注入”任何内容,但它适用于远程接口。
@Stateless
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote {
public String greet() {
return "hallo";
}
}
远程接口:
@Remote
public interface TestServiceRemote {
public String greet();
}
语言环境界面:
@Local
public interface TestServiceLocal {
public String greet();
}
这是测试:
@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);
}
}
我正在使用 arquillian-glassfish-embedded 1.0.0.CR2、glassfish-embedded-all 3.1 和 arquillian-junit-container 1.0.0.CR5 我的 pom 的相关部分是:
<!-- 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>
这是日志文件的相关部分(不包含任何异常):
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.
我的错误是什么? 我还需要更改为语言环境接口注入的实例吗?
您可以使用以下其中一项:
将beans.xml
文件添加到部署中:
return ShrinkWrap.create(JavaArchive.class, "test.jar").addClasses( TestServiceLocal.class, TestServiceRemote.class, TestServiceImpl.class).addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
这启用了 Arquillian 的 CDITestEnricher,它比 EJBTestEnricher 更强大。 它可以处理@Inject
注释(显然),还可以处理@Resource
和@EJB
注释(请参阅CDI 规范中有关资源注入的部分)。 然后容器将测试 class 实例中的两个@EJB
注释字段视为注入点并注入依赖项。
为具有已部署 bean 的可移植 JNDI 名称的字段指定@EJB
注释的mappedName
属性。 在您的情况下,它看起来像:
@EJB(mappedName="java:global/test/TestServiceImpl.com.acme;TestServiceLocal") private TestServiceLocal testServiceLocal;
您需要确保可移植 JNDI 名称与为您的部署生成的名称相同。 我只是指定了为我的“com.acme.TestServiceLocal”接口生成的那个。
除了答案之外,您还必须确保您使用正确的@Deployment
设置是正确的。 要在本地注入,您必须确保拥有@Deployment(testable=true)
(请注意,这是默认设置)。
来自Aquillian 文档:
容器内模式:@Deployment(testable = true)
正如我们上面提到的,我们需要重新打包您的@Deployment,添加一些 Arquillian 支持类,以便在容器中运行。 这使我们能够与测试进行通信,丰富测试并远程运行测试。 在这种模式下,测试在远程容器中执行; Arquillian 默认使用这种模式。
当您提供 @Deployment 时,请参阅完整协议参考以了解打包过程的预期 output 的概述。
客户端模式:@Deployment(testable = false)
现在这个模式是简单的部分。 与重新打包和覆盖测试执行的容器内模式相反,客户端模式尽可能少。 它不会重新打包您的@Deployment,也不会将测试执行转发到远程服务器。 您的测试用例按预期在您的 JVM 中运行,您可以自由地从外部测试容器,就像您的客户看到的那样。 Arquillian 唯一做的就是控制@Deployment 的生命周期。
下面是一个使用 as client 模式调用 Servlet 的例子。
这对 OP 没有帮助(他们有正确的设置),但我希望它能像我一样帮助那些来自谷歌的人。
尝试更改 TestServiceImpl->TestServiceBean 看起来嵌入式 glassfish 对 bean 名称有特定要求
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.