【问题标题】:Injection of @alternative bean with code, instead of beans.xml用代码注入@alternative bean,而不是 beans.xml
【发布时间】:2013-08-19 12:02:31
【问题描述】:

我们正在使用 JUnit 中的 EJBContainer 测试 EJB。被测试的 bean 调用的另一个 EJB 被测试用 @alternative bean 模拟。这个mock bean在beans.xml中配置为<alternative>

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

问题:是否可以仅使用代码而不是使用 beans.xml 来做同样的事情?

当然beans.xml 提供了很好的灵活性,尽管有时可能希望为同一个bean 使用不同的@alternative,并且可以为同一项目中的单个/其他测试选择一个特定的@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>

【问题讨论】:

    标签: java junit ejb cdi ejb-3.1


    【解决方案1】:

    您可以扩展现有的实现并使用@Specializes 对其进行注释,而不是创建独立的@Alternative 实现。

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

    【讨论】:

      【解决方案2】:

      你也许可以通过扩展来做到这一点,但我从未尝试过。

      【讨论】:

        【解决方案3】:

        beans.xml 替代部分留空。用

        注释测试类
        @RunWith(org.jglue.cdiunit.CdiRunner.class)
        @org.jglue.cdiunit.ActivatedAlternatives(EchoExtensionMock.class)
        public class MyTest {
        ...
        

        或者甚至更好地用相同的跑步者注释类,但产生一个替代的模拟:

        @RunWith(org.jglue.cdiunit.CdiRunner.class)
        public class MyTest {
        
          @Produces
          @org.jglue.cdiunit.ProducesAlternative
          @org.mockito.Mock
          private EchoExtensionMock echoExtension;
        
          @Inject
          private EchoRemote echoRemote;
        
          @Test
          public void test() throws Exception {
            Mockito.when(echoExtension.someMethod()).thenReturn(new Object());
        
            // here comes the testing code
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-28
          • 2017-12-18
          • 2020-08-30
          相关资源
          最近更新 更多