2012-06-04 4 views
3

Предположим, у меня есть лица без боб:Допускается ли наследование для EJB3 сессионных фанатов без учета состояния?

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

Я хочу создать макет для тестирования (с КДИ)

@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 класс, он отлично работает.

Любая идея или предложение решить эту проблему?

+0

Должно быть возможным подкласс класса EJB; подкласс не будет EJB, но если вы просто тестируете, это не имеет значения. Какое исключение вы получаете? –

ответ

1

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

@Local 
public interface Foo { 
... 
} 

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

Затем сделайте свой макет.

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

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

+0

Спасибо за ваш ответ, с отдельным интерфейсом, который работает, но и это то, чего мы хотели избежать :). Arquillian, кажется, отличная структура, я проверю это ... – kavai77

+0

Есть ли причина, по которой вы хотите избежать интерфейса? @LocalBean велик и полезен во многих случаях, однако, если вы будете использовать mocks, вероятно, неплохо использовать интерфейс. – Justin

Смежные вопросы