Как проверить, содержит ли класс Java тесты JUnit4? - PullRequest
1 голос
/ 29 января 2011

У меня есть класс Java. Как я могу проверить, содержит ли класс методы, которые являются тестами JUnit4? Нужно ли выполнять итерацию для всех методов, использующих отражение, или 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;
}

Ответы [ 3 ]

5 голосов
/ 29 января 2011

Предполагая, что ваш вопрос можно переформулировать как «Как я могу проверить, содержит ли класс методы с аннотацией 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.");
    }
}
4 голосов
/ 30 января 2011

Используйте встроенный класс 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;
}
3 голосов
/ 29 января 2011

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
    }
}
...