EJB 3.1 单元测试,两个 Bean,一个@DependsOn另一个,通过模拟交换



我目前正在用 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是一个很棒的工具,但是在开始时很难完全按照您想要的方式进行设置。幸运的是,有几个指南可以帮助您完成整个过程。

最新更新