java - EJB3Unit 需要 @LocalBean 的业务接口(interface)

标签 java unit-testing ejb ejb-3.1

我正在尝试解决 EJB3Unit ,对 EJB 3.1 无状态 bean 进行单元测试,但 EJB3Unit 提示,因为我的 EJB 没有“业务接口(interface)”。但我认为所有这些“业务接口(interface)”内容都是 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”接口(interface)。但我有一个 @LocalBean,所以我的类不应该需要任何接口(interface)。

最佳答案

远程和本地业务接口(interface)是 EJB 3.x 的一部分(在 EJB 3.0 中引入),而不是 EJB 2.x 的遗物。您所引用的遗迹可能是 EJB 2.x 远程和本地 home 接口(interface) - 那些强制扩展 javax.ejb.EJBHome/EJBLocalHome 并强制提供创建方法的接口(interface)。

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

EJB 3.1 规范使用以下术语:

Terminology note: This specification uses the term remote business interface to refer to the business interface of an EJB 3.x session bean that supports remote access. The term remote interface is used to refer to the remote component interface of the EJB 2.1 client view. The term local business interface refers to the local business interface of an EJB 3.x session bean that supports local access. The term local interface is used to refer to the local component interface of the EJB 2.1 client view.

EJB 3.x 远程业务接口(interface)、本地业务接口(interface)示例 和无界面 View :

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

关于java - EJB3Unit 需要 @LocalBean 的业务接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453308/

相关文章:

java - 二进制代码的约束计数集

java - 获取带有附件的 Notes Document 的内容到 Solr Document

javascript - 使用 URL 而不是 JS 文件的 Chai 请求

Python 使用部分测试属性

c# - 单元测试保存/检索对象

java - 如何使用 Math.random 将值放置在数组中的随机位置?

java - 如何显示 LinkedList 的所有内容?

java - 使用h :link and h:button in JSF GET method时如何从数据库获取数据

ejb - 是否可以使用 Java 1.5 通过客户端调用在 Java 1.4 上运行的 EJB?

java - 使用 Arquillian 测试安全 EJB