3

假设我有一个无状态 bean:

@Stateless(name = "fooBean")
@LocalBean
public class Foo {
...
}

我想创建一个用于测试的模拟(使用 CDI)

@Alternative @Specializes
public class FooMock extends Foo {
...
}

我在 中注册了模拟beans.xml,当我使用 OpenEJB 运行它时,出现以下异常:

...
Caused by: javax.naming.NameAlreadyBoundException:
openejb/Deployment/fooBean/com.company.Foo!LocalBeanHome

在我看来,容器创建了一个接口,Foo因为@LocalBean它现在FooMock也由 实现。OpenEJB 尝试将两个具有相同名称且生成的接口相同的类绑定,这是不可能的。

当然,如果我在课堂上发表评论@Stateless,效果很好。@LocalBeanFoo

有什么想法或建议来解决这个问题吗?

4

1 回答 1

1

而是做类似的事情:

@Local
public interface Foo {
...
}

@Stateless
public class FooBean implements Foo {
...
}

然后做你的模拟。

@Alternative
@Specializes
public class FooMock implements Foo {
...
}

但是,我建议您看一下Arquillian,它将使您的测试变得更加容易,而无需 @Alternative 和特殊的 beans.xml 条目进行测试。

于 2012-06-07T13:25:32.747 回答