我经常使用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();
}
}
或者可能有其他方法来处理它(除了重构被测试的类)?
答案 0 :(得分:1)
我认为,它没有提供这样的功能。最有可能的是它是设计糟糕的标志。你应该改变包结构。然后使用所需的包创建包装。
答案 1 :(得分:0)
我正在使用远程EJB调用进行集成测试而不是Arquillian。虽然我们必须为每个bean创建接口,但我们不需要为集成测试创建替代应用程序包,它为我的案例提供了更快的性能。但当然它不适用于CDI bean。 I posted a blog entry about my case.