2011-01-29 4 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

は、使用方法を確認するため、@Testアノテーションを探しているすべてのメソッドを繰り返すでしょう。

/** 
* 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()を使用してください。ここでキックオフの例は次のとおり

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

JUnitのは、一般的なアプローチをベースまたはテストケースを拡張することにより、注釈のいずれかを用いて構成されています。後者のケースでは、実装したインタフェース(object.getClass().getInterfaces())を探すためにリフレクションを使用します。前者の場合、私は内蔵のJUnitの4クラスorg.junit.runners.model.FrameworkMethod例えば、

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