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

时间:2015-01-30 12:44:26

标签: junit ejb cdi jboss-arquillian shrinkwrap

我经常使用EJB取决于几个(如5-10个)其他EJB / CDI bean,并且许多方法仅使用它们的一部分。集成测试(我们使用Arquillian和嵌入式Glassfish 4.0容器)它们很痛苦,因为我仍然需要为整个类图提供依赖性。我将类逐个添加到ShrinkWrap归档中,因为添加整个包创建了更多依赖项,并且我不想添加所有类,因为它显着增加了完成一个测试所需的时间。我也不想为每个测试添加所有类,特别是那些接触文件系统或执行shell命令的类。

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

是否可以自动为EJB / CDI Bean的集成测试创建虚拟类(不执行任何操作或抛出UnsupportedOperationExceptions)?类似的东西:

ShrinkWrap.create(JavaArchive.class, "test.jar")
     .addClass(MyTestedService.class)
     .addClass(ImportantDependency.class)
     .addClass(Dummy.createDummy(DependencyNeededForSomeMethods.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();
    }
}

或者可能有其他方法来处理它(除了重构被测试的类)?

2 个答案:

答案 0 :(得分:1)

我认为,它没有提供这样的功能。最有可能的是它是设计糟糕的标志。你应该改变包结构。然后使用所需的包创建包装。

答案 1 :(得分:0)

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