编程语言
首页 > 编程语言> > java – 用代码注入@alternative bean,而不是beans.xml

java – 用代码注入@alternative bean,而不是beans.xml

作者:互联网

我们在JUnit中使用EJBContainer测试EJB.测试bean调用的另一个EJB使用@alternative bean进行测试.此模拟bean配置为< alternative>在beans.xml中

一切都像魅力一样,EJB经过测试并使用模拟服务.

问题:是否可以仅使用代码执行相同操作,而不是使用beans.xml?

当然,beans.xml提供了很好的灵活性,但有时人们可能希望为同一个bean提供不同的@alternative,并且可以在同一个项目中为单个/其他测试选择一个特定的.也许另一个解决方案是某些测试的特定beans.xml(问题如何选择它)?

我们的一些测试代码(ExtensionMock由经过测试的EchoRemote实现和部分测试调用):

public class EchoTest {
private EJBContainer ejbContainer;
private Context ctx;


@Before
public void setUp() throws NamingException {
    ejbContainer = EJBContainer.createEJBContainer();
    ctx = ejbContainer.getContext();
}

@After
public void tearDown() {
    ejbContainer.close();
}

@Test
public void testFindAll() {
    try {
        EchoRemote userEJB = (EchoRemote) ctx.lookup("java:global/ssb-ejb/Echo!examples.ssb.EchoRemote");
        assertNotNull(userEJB);
        assertEquals("Hello World", userEJB.echo("Hello World"));
    } catch (NamingException e) {
        throw new AssertionError(e);
    }
}

}

<beans>

    <alternatives>
        <class>examples.ssb.EchoExtensionMock</class>
    </alternatives>

</beans>

解决方法:

您可以扩展现有的实现并使用@Specializes注释它,而不是创建独立的@Alternative实现.

另见:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Specializes.html

标签:ejb-3-1,java,junit,cdi,ejb
来源: https://codeday.me/bug/20190831/1776965.html