我目前正在用 Glassfish 3.1.2.2 做我的第一个 EJB 项目。我有两个豆子:
@Singleton
@Startup
public class ABean implements AInterface {
//implementation
}
和
@DependsOn("ABean")
@Startup
@Singleton
@EJB(name = "ABean", beaninterface = AInterface)
public class BBean implements BInterface {
//implementation
}
我想对"BBean"进行单元测试并模拟"ABean"。目前,当我启动JUnitTest时,"ABean"将被启动,但是有没有办法将"ABean"与"ABeanMock"交换?
我需要一个自动机制来交换与模拟的实现,因为这些测试将在 jenkins 服务器上运行。因此,手动采用代码对于单个手动测试是可以的,但不能用于自动测试。
我正在使用Glassfish Embedded API进行单元测试。
感谢您的帮助。
你可以使用 Arquillian 来实现这一点。
Arquiillian 在容器内运行测试,必要时部署到应用程序服务器。您可以选择仅使用选定的类,因此这将允许您创建实现AInterface
的替换ABean
,并选择不部署真正的ABean
- 这将导致使用替换类。
测试将如下所示:
@Singleton(name = "ABean")
class AMockBean implements AInterface {
// Mocked bean implementation
}
@RunsWith(Arquillian.class)
public class MyTests {
@Inject
private BBean bbean;
@Deployment
public Archive<?> deployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(BBean.class)
.addClass(AMockBean.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Test
public void testBBean() {
bbean.whatever();
}
}
这一切都未经测试,但它应该是与此类似的内容。根据您的环境和依赖项,正确配置可能更加困难。
Arquillian是一个很棒的工具,但是在开始时很难完全按照您想要的方式进行设置。幸运的是,有几个指南可以帮助您完成整个过程。