【发布时间】:2016-08-28 12:18:35
【问题描述】:
我在 EJB,尤其是 EJB 3.0 方面没有那么丰富的经验,因此,我遇到了一个我想解决的问题。我发现了一个类似的问题 here,但建议的解决方案没有帮助。
我有一个远程无状态 EJB,其业务方法在接口中声明,实现这些方法的 bean 还有其他未在接口中声明的方法。
这里以业务接口为例:
public interface BusinessLogic {
Object create();
void delete(Object x);
}
一个实现业务逻辑的BusinessLogicBean:
@Stateless
@Remote(BusinessLogic.class)
public class BusinessLogicBean implements BusinessLogic {
/** implemented method */
public Object create() {
Object x = new SomeDBMappedObject();
// create an object in DB and return wrapper class
...
return x;
}
/** implemented method */
public void delete(Object x) {
// deleting object from DB
...
}
/** The method that performs some extra logic */
public void aMethod() {
// do extra logic
}
}
我需要使用 Arquillian 框架为该 EJB 编写单元测试,包括未在业务接口中声明的 bean 方法。
例子:
@RunWith(Arquillian.class)
public class BusinessLogicTest {
/** will be injected during the test run */
@EJB
private BusinessLogic businessLogic;
@Deployment
public static Archive createDeployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
// add needed libraries and classes
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
return war;
}
@Test
public void aMethodTest() {
businessLogic.aMethod();
// Write appropriate assertions
}
}
我的问题是:
- 如何在我的测试中调用
aMethod()? 我不能像businessLogic.aMethod();那样称呼它,因为它会导致编译错误。 我不能像((BusinessLogicBean) businessLogic).aMethod();那样称呼它,因为它会导致ClassCastException,因为实际对象是com.sun.proxy.$ProxyXXX类型。 或 - 有没有办法直接注入
BusinessLogicBean对象而不是BusinessLogic?
【问题讨论】:
-
我认为您在这里混合了两种类型的测试:一方面您有集成测试,您可以在其中测试,例如,远程调用您的
BusinessLogic的create和delete方法;另一方面,您有单一测试,您可以在其中单独测试一段源代码,例如,您的业务逻辑实现:BusinessLogicBean。因此,您可以继续使用 Arquillian 进行集成测试,但您应该为BusinessLogicBean的单一测试创建一个仅使用 JUnit 的测试用例。 -
亲爱的@aribeiro,如果我想测试的方法只是内部业务逻辑,我会同意你的看法。该功能影响了我的 EJB 中的太多东西,因此它的测试需要包含在集成测试中。你可能会问:那为什么不包含在业务接口中呢?但这是因为它已经是这样写的(在我开始工作之前),我不想改变它。无论如何,感谢您的评论和兴趣。
-
不客气。 :) 好吧,既然您已经在部署中添加了 beans.xml,您可以随时尝试在测试中使用 CDI 和
@Inject您的BusinessLogicBean。
标签: java unit-testing jakarta-ee ejb jboss-arquillian