2012-02-26 3 views
2

EJB3Unitでグリップを取得しようとしていますが、EJB 3.1のステートレスBeanをユニットテストするためにEJBに「ビジネスインタフェース」がないためにEJB3Unitがエラーになります。しかし、私はこの "ビジネスインタフェース"のすべてがEJB 2の遺物だと思ったので、私はそれを必要とすべきではありません。これは、私がEJB3Unitを間違って使用しているためですか? EJB3Unitをユニットテストのために動かすにはどうすればいいですか?EJB3Unitは@LocalBeanのビジネスインタフェースを要求します

マイEJBは、本質的にこれです:

:ユニットテストは、ため、次の例外の失敗

package uk.co.nildram.badamson.aoc4; 

public final class AocServiceTest extends BaseSessionBeanFixture<AocService> { 

    private static final Class<?>[] USED_ENTITY_BEANS = {}; 

    public AocServiceTest() { 
     super(AocService.class, USED_ENTITY_BEANS); 
    } 

    @Test 
    public void testCreateSessionBean() { 
     final AocService bean = getBeanToTest(); 
     checkInvariants(bean); 
    } 

    public static void checkInvariants(final AocService service) { 
     // assertions 
    } 

    // Other code 

}

package uk.co.nildram.badamson.aoc4; 

@Stateless 
@LocalBean 
public class AocService { 

    @PersistenceContext(unitName = "aoc4") 
    private EntityManager entityManager; 

    // Other code 
} 

マイユニットテストクラスは、本質的にこれです

java.lang.IllegalStateException: No business interface found on class 'uk/co/nildram/badamson/aoc4/AocService'. 
at com.bm.ejb3metadata.annotations.helper.bean.session.SessionBusinessInterfaceFinder.resolve(SessionBusinessInterfaceFinder.java:86) 
at com.bm.ejb3metadata.annotations.helper.bean.SessionBeanHelper.resolve(SessionBeanHelper.java:69) 
at com.bm.ejb3metadata.annotations.helper.ResolverHelper.resolve(ResolverHelper.java:91) 
at com.bm.ejb3metadata.MetadataAnalyzer.analyze(MetadataAnalyzer.java:82) 
at com.bm.ejb3metadata.MetadataAnalyzer.analyzeClasses(MetadataAnalyzer.java:49) 
at com.bm.ejb3metadata.MetadataAnalyzer.initialize(MetadataAnalyzer.java:36) 
at com.bm.ejb3metadata.annotations.metadata.MetaDataCache.getMetaData(MetaDataCache.java:129) 
at com.bm.ejb3metadata.annotations.metadata.MetaDataCache.getDynamicModuleCreator(MetaDataCache.java:105) 
at com.bm.creators.SessionBeanFactory.getInjector(SessionBeanFactory.java:78) 
at com.bm.creators.SessionBeanFactory.createSessionBean(SessionBeanFactory.java:60) 
at com.bm.testsuite.BaseSessionBeanFixture.setUp(BaseSessionBeanFixture.java:92) 
at junit.framework.TestCase.runBare(TestCase.java:132) 
at junit.framework.TestResult$1.protect(TestResult.java:110) 
at junit.framework.TestResult.runProtected(TestResult.java:128) 
at junit.framework.TestResult.run(TestResult.java:113) 
at junit.framework.TestCase.run(TestCase.java:124) 
at junit.framework.TestSuite.runTest(TestSuite.java:243) 
at junit.framework.TestSuite.run(TestSuite.java:238) 
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

例外をスローするコードはhttp://ejb3unit.sourceforge.net/xref/com/bm/ejb3metadata/annotations/helper/bean/session/SessionBusinessInterfaceFinder.htmlのようです。これは実際には "javax/ejb"インタフェースを要求しているようです。しかし、私は@LocalBeanを持っているので、私のクラスはインターフェースを必要とすべきではありません。

+0

、同じ問題が発生します。 – Raedwald

答えて

2

リモートおよびローカルビジネスインターフェイスは、EJB 3.x(EJB 3.0で導入されました)の一部であり、EJB 2.xからは信頼できません。遺物として参照しているのは、おそらくEJB 2.xのリモートとローカルのホーム・インタフェースです。これは、javax.ejb.EJBHome/EJBLocalHomeを強制的に拡張し、作成メソッドを提供することを余儀なくされるものです。

EJB 3.1の一部であるインタフェースなしのビュー(別のビジネスインタフェースなし)の概念を使用し、EJB 3.0のみをサポートするEJB 3.0しかサポートされていないため、動作しません。 @Localまたは@Remoteでアノテーションされたインターフェイスが必要で、AocServiceを実装し、そのインターフェイス経由でAocServiceを使用するようにする必要があります。 3.1仕様は、以下の用語を使用し

EJB:

用語注:この仕様は、EJB 3.xのセッションのビジネス・インターフェースのリモートアクセスをサポート Beanに参照するために インタフェースを長期遠隔ビジネスを使用しています。リモートインタフェースという用語は、EJB 2.1クライアントビューのリモートコンポーネントインタフェースを参照するために使用されます( )。 ローカルビジネスインタフェースという用語は、ローカルアクセスをサポートするEJB 3.xセッションBeanのローカルビジネス インターフェイスを指します。 用語ローカル・インタフェースは、EJB 2.1クライアント・ビューのローカル・コンポーネント・インタフェース を参照するために使用されます。 EJB 3.xのリモートビジネスインタフェース、ローカルビジネスインタフェース 無インターフェースビュー

例:基底クラスとして、代わりに `BaseSessionBeanFixture`の` MockedSessionBeanFixture`を使用

@javax.ejb.Local 
public interface LocalBusinessInterface { 
} 

@javax.ejb.Remote 
public interface RemoteBusinessInterface { 
} 

//@LocalBean is annotation that was introduced in EJB 3.1 
//according Javadoc it "Designates that a session bean exposes a 
//no-interface view." 
//When bean does not implement other interfaces, using @LocalBean 
//is redundant, because beans without any interfaces expose no-interface view 
//by default. 
@LocalBean 
@Stateless 
public class BeanImplementation 
    implements LocalBusinessInterface, RemoteBusinessInterface { 
} 
+0

ありがとうございます。 – jgitter

関連する問題