Jboss 使用arquillian测试远程客户端jndi查找

Jboss 使用arquillian测试远程客户端jndi查找,jboss,jboss-arquillian,Jboss,Jboss Arquillian,设置:arquillian,JBossAS 7.1.1.final作为托管容器 我目前正在将EJB应用程序从EJB2.x迁移到3.x,并将JBoss3.x迁移到JBossAS7.1。 在这个过程中,我想让大多数课程都接受测试,但却被阿奎利安绊倒了。 虽然arquillian似乎在bean间功能上提供了一些不错的特性,但我无法确定使用jndi查找测试远程客户端特性是否有效 我在我的bean上使用了Arquillian入门指南,这很有效,但由于这些指南使用@Inject,并且在我的应用程序中,jnd

设置:arquillian,JBossAS 7.1.1.final作为托管容器

我目前正在将EJB应用程序从EJB2.x迁移到3.x,并将JBoss3.x迁移到JBossAS7.1。 在这个过程中,我想让大多数课程都接受测试,但却被阿奎利安绊倒了。 虽然arquillian似乎在bean间功能上提供了一些不错的特性,但我无法确定使用jndi查找测试远程客户端特性是否有效

我在我的bean上使用了Arquillian入门指南,这很有效,但由于这些指南使用@Inject,并且在我的应用程序中,jndi查找在任何地方都使用,所以我(至少我认为我)需要偏离这条路径

下面是我创建的测试用例。在所有使用jndi属性的尝试中,我都明确地离开了,我认为这些属性可能会有所帮助

测试

should_create_greeting()
如果迎宾bean使用单独的生产者,则该方法有效

@RunWith(Arquillian.class)
public class GreeterTest {
    public static final String ARCHIVE_NAME = "test";

    Logger logger = Logger.getLogger(GreeterTest.class.getName());

    @Deployment
    public static Archive<?> createDeployment() {
        JavaArchive jar = ShrinkWrap.create(JavaArchive.class, ARCHIVE_NAME + ".jar").addPackage(Greeter.class.getPackage())
            .addAsManifestResource("test-persistence.xml", "persistence.xml").addAsManifestResource("OracleGUIDS-ds.xml")
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    return jar;
    }

    /**
     * @Inject works using a producer with {@code @Produces}
     */
     // @Inject
     // Greeter greeter;
     @ArquillianResource
     Context context;

     GreeterRemote greeter;

     @Before
     public void before() throws Exception {
         Map<String, String> env = new HashMap<>();
         env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.as.naming.InitialContextFactory");
         env.put("jboss.naming.client.ejb.context", "true");
         // env.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT",
         // "false");
         // env.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS",
         // "false");
         // env.put("jboss.naming.client.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED",
         // "false");
         for (Map.Entry<String, String> entry : env.entrySet()) {
             context.addToEnvironment(entry.getKey(), entry.getValue());
         }
         greeter = (GreeterRemote) context.lookup(ARCHIVE_NAME + "/" + Greeter.class.getSimpleName() + "!"
            + GreeterRemote.class.getName());
     }

     @Test
     public void should_create_greeting() {
         Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling"));
         greeter.greet(System.out, "Earthling");
     }
@RunWith(Arquillian.class)
公共类迎宾测验{
公共静态最终字符串存档\u NAME=“test”;
Logger=Logger.getLogger(GreeterTest.class.getName());
@部署
公共静态存档createDeployment(){
JavaArchive jar=ShrinkWrap.create(JavaArchive.class,ARCHIVE_NAME+“.jar”).addPackage(Greeter.class.getPackage())
.addAsManifestResource(“test persistence.xml”、“persistence.xml”).addAsManifestResource(“OracleGUIDS.xml”)
.addAsManifestResource(EmptyAsset.INSTANCE,“beans.xml”);
返回罐;
}
/**
*@Inject使用具有{@code@products}的生产者工作
*/
//@注入
//迎宾员;
@阿奎利安资源
语境;
格里特雷莫迎宾员;
@以前
public void before()引发异常{
Map env=new HashMap();
env.put(Context.INITIAL_Context_FACTORY,“org.jboss.as.naming.InitialContextFactory”);
put(“jboss.naming.client.ejb.context”,“true”);
//env.put(“jboss.naming.client.connect.options.org.xnio.options.SASL\u POLICY\u NOPLAINTEXT”,
//“虚假”);
//env.put(“jboss.naming.client.connect.options.org.xnio.options.SASL_POLICY_noanymous”,
//“虚假”);
//env.put(“jboss.naming.client.connectionprovider.create.options.org.xnio.options.SSL_ENABLED”,
//“虚假”);
对于(Map.Entry:env.entrySet()){
addToEnvironment(entry.getKey(),entry.getValue());
}
greeter=(GreeterRemote)context.lookup(ARCHIVE_NAME+“/”+greeter.class.getSimpleName()+“!”
+greetremote.class.getName());
}
@试验
public void应创建问候语(){
Assert.assertEquals(“你好,地球人!”,greeter.createGreeting(“地球人”);
问候者。问候(System.out,“地球人”);
}
}


是否可以使用jndi查找运行此测试?我遗漏了什么吗?

如果您想测试EJB的远程功能,您可能希望在客户端而不是容器中运行

您可以使用@Deployment(testable=false)将部署配置为仅客户端。@Test方法将像远程客户端一样运行


除此之外,如果需要,您还可以通过注入的上下文查找bean

我也遇到了同样的问题,所以在一个解决方案中,我刚刚添加了要测试的方法,将remoteejb作为一个参数。 在我的ejb上:

public List localBean.obtain(RemoteEJB remoteEjb){
 return remoteEjb.obtain();
}
然后在arquillian测试中:

@Inject
private LocalBean localBean;

@Inject
private RemoteEJB remoteEjb;


  @Test
    public void test(){
       List<Vo>voList =  localBean.obtain(remoteEjb);
    }

谢谢你的回复。在使用我部署用于特定测试的托管服务器时,这是否起作用,或者我是否需要有一个运行部署的服务器?我真的希望在测试期间将bean部署到托管服务器,然后对这些bean运行一些测试。但是如果我尝试这样做,例如使用两个部署,我似乎无法远程访问bean。
@EJB(lookup="java:global/ear/ejb/RemoteEjb")
private RemoteEJB remoteEjb;