EJB3Unit需要@LocalBean的业务接口

时间:2012-02-26 13:06:17

标签: java unit-testing ejb ejb-3.1

我正试图掌握EJB3Unit,对EJB 3.1无状态bean进行单元测试,但EJB3Unit抱怨因为我的EJB没有“业务接口”。但我认为所有这些“业务接口”的东西都是EJB 2的遗留物,所以我不应该需要它。这是因为我正在使用EJB3Unit吗?我需要做些什么才能使EJB3Unit适用于我的单元测试?

我的EJB基本上是这样的:

package uk.co.nildram.badamson.aoc4;

@Stateless
@LocalBean
public class AocService {

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

   // Other code
}

我的单元测试课基本上是这样的:

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

}

由于以下异常,单元测试失败:

 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,所以我的班级不应该要求任何接口。

1 个答案:

答案 0 :(得分:2)

远程和本地业务接口是EJB 3.x(在EJB 3.0中引入)的一部分,而不是来自EJB 2.x的遗留物。你所引用的文件可能是EJB 2.x远程和本地home接口 - 那些被迫扩展javax.ejb.EJBHome / EJBLocalHome并被迫提供create-methods的接口。

您使用无接口视图的概念(没有单独的业务接口),它是EJB 3.1的一部分,EJB3Unit仅支持EJB 3.0,这就是它无法工作的原因。您需要的接口是用@Local或@Remote注释并使AocService实现它,然后通过它的接口使用AocService。

EJB 3.1规范使用以下术语:

  

术语说明:此规范使用术语远程业务   接口,用于引用EJB 3.x会话的业务接口   支持远程访问的bean。术语远程接口用于   请参阅EJB 2.1客户端视图的远程组件接口。   术语本地业务接口是指本地业务   支持本地访问的EJB 3.x会话bean的接口。该   术语本地接口用于指代本地组件接口   EJB 2.1客户端视图。

EJB 3.x远程业务接口,本地业务接口的示例 和无界面视图:

@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 {
}