查找单个方法调用所依赖的所有类/ Arquillian Micro Deployments:如何自动收集必要的类?

时间:2013-11-07 14:52:08

标签: java deployment integration-testing jboss-arquillian 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");

    // 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;
}

每次要测试某个用例时,例如registerUser,使用arquillian,您将必须收集注册过程所依赖的所有类,并将它们放在一个可部署的存档中。

手动执行此操作会花费时间并产生问题和错误,当然!有几个弱点:

收集:考虑一个包含许多子服务,异常,接口,超类,实用程序等的长进程。您将遍历完整的流程以找到它们。老实说,这是一个重复的长期工作,这将是一个痛苦...... 眼睛。在我决定开始大喊大叫之前,我不得不这样做几次。

让您的测试保持最新状态:想象一下,您将新的子服务纳入您的注册链。你将不得不更新那些该死的依赖项,如果在一天结束时运行集成测试时出现问题,将会很有趣地挖掘有时不完整的异常消息(不完整的原因你只知道某些东西在某些时候缺失但不是什么究竟)。如果你很幸运,会发生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;
}

我不认为可以使用反射实现这一点,因为有必要知道确切的“流程”。

我打赌那里有一个很酷的工具,可能会被意外使用。当然可能有其他方式。有人有想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以试用Arquillian integration in JBoss Tools。你会找到一些关于如何使用它的信息,in this GitHub repo;请参阅自述文件。那里链接的截屏视频可能很有用。

要开始使用JBoss Tools,您可以使用these instructions通过JBT更新站点将其安装到现有的Eclipse Kepler(e4.3)或更高版本的安装中。

请注意,目前这被认为是实验性的,因此它不包含在JBoss Developer Studio(包装Eclipse和一些插件的发行版)中,并且仅在社区位中可用,即JBoss Tools。如果您在JBoss Tools JIRA中提交任何遇到的问题(或任何新的功能请求),我们将不胜感激(请使用测试工具组件)。