喂!
我发现的问题很容易理解,但我找不到解决方案。
首先让我提供这个小片段。
@Deployment
public static Archive<?> createDeployableArchive () {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "whoCares.jar");
// enable CDI
jar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml");
// Some persistence
jar.addAsManifestResource("test-persistence.xml", "persistence.xml");
// Now the interisting part (simplified):
jar.addClass(RegistrationService.class) // This one should be tested
.addClass(RegistrationException.class) // Will be thrown on error.
.addClass(UserDAO.class) // Used by RegService
.addClass(User.class) // JPA Entity
// ...
// ... This scenario goes without interfaces, inheritance, DTOs, different
// ... types of exceptions for different problem types... That's why the list
// ... is so concise.
// ...
.addClass(RegServiceIntegrationTest.class); // Test class must be included
return jar;
}
每次您想使用 arquillian 测试某个用例(例如 registerUser)时,您都必须收集您的注册过程所依赖的所有类,并将它们放在一个可部署的存档中。
当然,手动执行此操作会花费时间并产生问题和错误!有几个弱点:
收集:考虑一个包含许多子服务、异常、接口、超类、实用程序等的长流程。您将走过完整的流程以找到所有内容。老实说,这是一项重复性的长期工作,会让...眼睛感到痛苦。在我决定开始大喊大叫之前,我不得不这样做几次。
使您的测试保持最新:假设您在注册链中加入了一个新的子服务。您将不得不更新那些该死的依赖关系,如果在一天结束时运行集成测试时出现问题,那么挖掘有时不完整的异常消息将会很有趣(不完整的原因是您只知道在某些时候缺少某些东西而不是什么确切地)。如果幸运的话,会发生 ClassNotFoundException。一项更改当然很容易影响多个测试: 1. 让 UserDao 抛出一些新奇特的运行时异常。2.浪费你的生命时间。
添加包的问题:添加包是由 Shrinkwrap 提供的,但使用它是个坏主意。有时,在漫长的一天之后,您会感到懒惰并只是添加完整的包,但您可以绝对确定每个课程将永远保留在同一个包中吗?另一个问题是术语“微部署”意味着需要紧凑性。整个包会引入开销,好吧,我想这是这里最小的问题。
如何解决这个问题(只是不合格的想法)?
源代码中已经提供了所有必需的信息,这有点陈词滥调。
最好的解决方案是这样的:
@Deployment
public static Archive<?> createDeployableArchive () {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "whoCares.jar");
// enable CDI
jar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml");
// Some persistence
jar.addAsManifestResource("test-persistence.xml", "persistence.xml");
Class<?>[] involved;
involved = Tool.findInvolvedClasses("RegistrationService.java", "registerUser");
jar.addClasses(involved);
return jar;
}
我认为使用反射无法实现这一点,因为有必要知道确切的“流程”。
我敢打赌,那里有一个很酷的工具,可能会被意外使用。当然可能还有其他方法。有人有想法吗?谢谢!