2016-03-15 65 views
3

我有Java Enterprise应用程序,其中包含超过10个项目,并被编译到一个耳朵归档中。我需要做一些集成测试,我必须在ShrinkWrap中使用Arquillian平台。在@Deployment带注释的方法中,我必须明确地将每个类包含在我需要测试的类的依赖关系树中。添加单个企业Bean的EJB依赖项注入所需的所有类

我的问题:是否有一种工具可以为从单个EJB开始通过EJB注释(CDI)引用的类构建类树?

例如:我有这样的树(省略一些类)

@Singleton 
public class A{ 
    @EJB 
    B b; 

    public void doSomethingOnB(){ 
     b.doSomething(); 
    } 
} 

@Singleton 
public class B{ 
    @EJB 
    C c; 

    @EJB 
    D d; 

    @EJB 
    E e; 

    public void doSomething(){ 
     d.toString(); 
     e.toString(); 
     c.fin(); 
    } 

} 

@Singleton 
public class C{ 
    @EJB 
    E e; 

    @EJB 
    F f; 

    public void fin(){ 
     System.out.println(f.toString()+e.toString); 
    } 
} 

@Deployment标注的方法是这样的:

@RunWith(Arquillian.class) public class ClassAlphaTest { 

    @Deployment(testable=true) 
    public static JavaArchive createDeployment() { 
     JavaArchive jar = ShrinkWrap.create(JavaArchive.class) 
      .addClass(A.class) 
      .addClass(B.class) 
      .addClass(C.class) 
      .addClass(D.class) 
      .addClass(E.class) 
      .addClass(F.class) 
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
     System.out.println(jar.toString(true)); 
     return jar; 
    } 

而且我的测试:

@Test 
    public void testLoadCategories(A alpha) { 

     System.out.println("DoingTest"); 
     alpha.doSomethingOnB(); 

    } 

我希望我的createDeployment看起来更像这样:

@Deployment(testable=true) 
public static JavaArchive createDeployment() { 
    List<Class> classes = buildClassTree(A.class); 

    JavaArchive jar = ShrinkWrap.create(JavaArchive.class) 
     .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    foreach(Class c : classes){ 
     jar.addClass(c); 
    } 
    System.out.println(jar.toString(true)); 
    return jar; 
} 

其中buildClassTree是我正在寻找的方法。

回答

4

我刚刚创建了一些实用程序方法,可以帮助获取给定类的EJB注入树。

public class TestJavaClassTreeConstruct { 

    /** 
    * To test everything works 
    */ 
    @Test 
    @SuppressWarnings("rawtypes") 
    public void testLoadingClassList() { 
     Class inputSingleClass = ExportTagsResource.class; 
     Set<Class> list = getEjbAnnotatedClassTree(inputSingleClass); 
     for (Class class1 : list) { 
      System.err.println(class1.getName()); 
     } 
    } 

    /** 
    * Returns the ejb classes sufficient to complete the EJB injection class 
    * tree starting from the class "inputSingleClass" 
    * 
    * @param inputSingleClass 
    * @return 
    */ 
    @SuppressWarnings("rawtypes") 
    public static Set<Class> getEjbAnnotatedClassTree(Class inputSingleClass) { 
     Set<Class> classes = new HashSet<Class>(); 
     classes.add(inputSingleClass); 
     return getEjbAnnotatedClassTree(classes); 
    } 

    /** 
    * Gets the ejb class tree starting from a list of classes. 
    * 
    * @param classList 
    * @return 
    */ 
    @SuppressWarnings("rawtypes") 
    public static Set<Class> getEjbAnnotatedClassTree(Set<Class> classList) { 
     boolean found = false; 
     List<Class> tempList = new ArrayList<Class>(); 

     for (Class innerClass : classList) { 

      for (Field field : innerClass.getDeclaredFields()) { 
       if (field.isAnnotationPresent(EJB.class)) { 
        if (!classList.contains(field.getType())) { 
         tempList.add(field.getType()); 
         found = true; 
        } 
       } 
      } 
     } 
     classList.addAll(tempList); 
     if (found) { 
      classList.addAll(getEjbAnnotatedClassTree(classList)); 
     } 
     return classList; 
    } 
} 

类列表然后可以结合在罐子创建过程

@Deployment(testable = true, managed = true) 
public static JavaArchive createDeployment() { 

    TestJavaClassTreeConstruct.getEjbAnnotatedClassTree(ExportTagsResource.class); 
    JavaArchive jar = ShrinkWrap.create(JavaArchive.class); 


    for (Class c : TestJavaClassTreeConstruct.getEjbAnnotatedClassTree(MyMainClass.class)) { 
     jar.addClass(c); 
    } 
    jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    System.out.println(jar.toString(true)); 

    return jar; 
} 
可以使用具有拆封