2012-06-04 64 views
3

假設我有一個無狀態的bean:允許EJB3無狀態會話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 

在我看來,容器創建因爲接口,現在也由FooMock實現。 OpenEJB嘗試將兩個類與具有相同生成接口的相同名稱綁定,這是不可能的。

當然,如果我在Foo類中註釋掉@Stateless@LocalBean,它工作正常。

任何想法或建議來解決這個問題?

+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在很多情況下都很好用,但是如果你使用mock,那麼使用一個接口可能是一個好主意。 – Justin

相關問題