2011-01-29 100 views
1

我有一個Java類。如何檢查類是否包含JUnit4測試的方法?我是否必須對使用反射的所有方法進行迭代,還是JUnit4提供這種檢查?如何檢查Java類是否包含JUnit4測試?

編輯:

,因爲評論中不能包含的代碼,我放在基礎上,答案在這裏我的代碼:

private static boolean containsUnitTests(Class<?> clazz) 
{ 
     List<FrameworkMethod> methods= new TestClass(clazz).getAnnotatedMethods(Test.class); 
     for (FrameworkMethod eachTestMethod : methods) 
     { 
      List<Throwable> errors = new ArrayList<Throwable>(); 
      eachTestMethod.validatePublicVoidNoArg(false, errors); 
      if (errors.isEmpty()) 
      { 
       return true; 
      } 
      else 
      { 
       throw ExceptionUtils.toUncheked(errors.get(0)); 
      } 
     } 
     return false; 
} 

回答

4

使用內置的JUnit 4類org.junit.runners.model.FrameworkMethod檢查方法。

/** 
* Get all 'Public', 'Void' , non-static and no-argument methods 
* in given Class. 
* 
* @param clazz 
* @return Validate methods list 
*/ 
static List<Method> getValidatePublicVoidNoArgMethods(Class clazz) { 

    List<Method> result = new ArrayList<Method>(); 

    List<FrameworkMethod> methods= new TestClass(clazz).getAnnotatedMethods(Test.class); 

    for (FrameworkMethod eachTestMethod : methods){ 
     List<Throwable> errors = new ArrayList<Throwable>(); 
     eachTestMethod.validatePublicVoidNoArg(false, errors); 
     if (errors.isEmpty()) { 
      result.add(eachTestMethod.getMethod()); 
     } 
    } 

    return result; 
} 
+0

謝謝!看看我是如何在問題主體中使用它的。 – oshai 2011-01-30 18:13:57

5

假設你的問題可以重新作爲「我怎麼能檢查該類包含使用org.junit.Test註釋的方法?「,然後使用Method#isAnnotationPresent()。以下是一個開創性的例子:

for (Method method : Foo.class.getDeclaredMethods()) { 
    if (method.isAnnotationPresent(org.junit.Test.class)) { 
     System.out.println("Method " + method + " has junit @Test annotation."); 
    } 
} 
3

JUnit通常使用基於註解的方法或通過擴展TestCase進行配置。在後一種情況下,我將使用反射來查找已實現的接口(object.getClass().getInterfaces())。在前一種情況下,我會遍歷所有的方法尋找@Test註釋,例如,

Object object; // The object to examine 
for (Method method : object.getClass().getDeclaredMethods()) { 
    Annotation a = method.getAnnotation(Test.class); 
    if (a != null) { 
     // found JUnit test 
    } 
}