Разрешено ли наследование для EJB3-компонентов без состояния?

Предположим, у меня есть бин без гражданства:

@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 а также @LocalBean в Foo класс, работает нормально.

Любая идея или предложение, чтобы решить это?

1 ответ

Решение

Скорее сделайте что-то вроде:

@Local
public interface Foo {
...
}

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

Тогда заставь себя издеваться.

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

Однако я рекомендую вам взглянуть на Arquillian, он значительно упростит ваше тестирование без необходимости в @Alternative и специальных записях beans.xml для тестов.

Другие вопросы по тегам