在 Arquillian 中集成测试具有许多依赖项的 EJB

Integration testing EJBs with many dependencies in Arquillian

我经常有 EJB 依赖于几个(比如 5-10 个)其他 EJBs/CDI bean,许多方法只使用它们的一个子集。集成测试(我们使用带有嵌入式 Glassfish 4.0 容器的 Arquillian)它们很痛苦,因为我仍然必须为整个 class 图提供依赖关系。我将 class 一个一个地添加到 ShrinkWrap 存档中,因为添加整个包会创建更多依赖项,我不想添加所有 class 个,因为它会显着增加完成一个所需的时间测试。我也不希望为每个测试添加所有 classes,尤其是那些涉及文件系统或执行 shell 命令的测试。

如果依赖关系图增长,我通过使用抛出 UnsupportedOperationExceptions 的方法简单地实现 EJBs 接口来创建虚拟对象,但这变得很乏味,因为它们很多而且很难维护 class 名称更改(您期望 MyService 存在一个 DummyMyService,但由于它是从 OldService 重命名的,您将创建另一个虚拟对象,因为您没有找到 DummyOldService)。

是否可以为 EJBs/CDI Beans 的集成测试自动创建虚拟 classes(什么也不做或抛出 UnsupportedOperationExceptions)?类似于:

ShrinkWrap.create(JavaArchive.class, "test.jar")
     .addClass(MyTestedService.class)
     .addClass(ImportantDependency.class)
     .addClass(Dummy.createDummy(DependencyNeededForSomeMethods.class));

对于像这样的 class 当我只想测试 doImportantThings 方法时:

@Stateless
public class MyTestedService {

    @Inject
    private ImportantDependency importantDependency;

    @Inject
    private DependencyNeededForSomeMethods dependencyNeededForSomeMethods;

    public void doImportantThings(){
         ....
         importantDependency.doIt();
         ....
    }

    public void doSomethingElse(){
         ....
         dependencyNeededForSomeMethods.doRarelyNeededThings();
         ....
         importantDependency.doAnotherThing();
    }
}

或者也许有另一种方法来处理它(除了重构正在测试的 classes)?

我想,它没有提供这样的功能。这很可能是设计不良的标志。您应该更改包结构。然后仅使用所需的包创建包装。

我正在使用远程 EJB 调用而不是 Arquillian 进行集成测试。尽管我们必须为每个 bean 创建接口,但我们不需要为集成测试创建替代应用程序包,并且它为我的案例提供了更快的性能。但当然它不适用于 CDI bean。 I posted a blog entry about my case.