2011-01-29 2 views
1

У меня есть класс Java. Как проверить, содержит ли класс методы, которые являются тестами JUnit4? Нужно ли выполнять итерацию во всех методах с использованием отражения, или JUnit4 предоставляет такую ​​проверку?Как проверить, содержит ли Java-класс тесты JUnit4?

Edit:

поскольку комментарии не могут содержать код, я разместил свой код, основанный на ответ здесь:

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

+0

@ohadshai: Логическая проблема: if (errors.isEmpty()) {return true;} '. Что следует за методом, не подтвержденным валидацией? Вы можете исправить это легко :) –

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 
    } 
} 
Смежные вопросы