我正试图掌握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
,所以我的班级不应该要求任何接口。
答案 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 {
}