2016-04-05 14 views
0

私はいくつかのSFTP検証のためのテストを書いています。私は組み込みsftpサーバを実行しています。特定のアノテーションを持つメソッドによって呼び出されるJavaメソッドの制限

ので、私のようなクラスを持っている:

public class SftpServer { 

    //method to initialize server 
    public void init(){}; 

    //method to stop server 
    public void stop(){}; 

    } 

今、私のテストは、マルチスレッド環境で実行すると、私は、サーバーが起動または一度だけ停止することにしたい、私はユニットテストフレームワークとしてTestNGを使用しています。

ので、私はinitのみ@BeforeSuiteまたは@AfterSuite注釈付きメソッドannotatedと呼ばれるstop方法は、私は、Javaのドキュメントは多分それがこのように行われますが、私はしたい取得をお勧めする方法はにそれを強制することを知ってほしいですJavaでこの制限を何らかの形で課すことは可能でしょうか?

+0

いいえ、注釈はコンパイラのメタ情報を保持するだけであり、メソッドへのアクセスを制限することはできません。 –

+0

呼び出し元のメソッドの注釈クラス名を検索し、正しい注釈でない場合は例外をスローしますか? – Anirudh

+0

呼び出しメソッドを見つけ、その注釈を解決するためにリフレクションを使用します:) –

答えて

0

これは、あなたが欲しいものを行うための最良の選択肢ではないかもしれないが、あなたはとにかくそれを達成することができるようになります:注釈のリストで

public void test() { 
    StackTraceElement element = getElement(); 
    try { 
     Method m = Class.forName(element.getClassName()).getDeclaredMethod(element.getMethodName()); 
     Annotation[] annotations = m.getAnnotations(); 
     // do your thing 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 

private static StackTraceElement getElement() { 
    StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 
    for (int i = 1; i < elements.length; i++) { 
     StackTraceElement stackTraceElement = elements[i]; 
     if (!stackTraceElement.getClassName().equals(Bar.class.getName()) 
       && !stackTraceElement.getMethodName().equals("getElement()") 
       && stackTraceElement.getClassName().indexOf("java.lang.Thread") != 0) { 
      return stackTraceElement; 
     } 
    } 
    return null; 
} 

手元に発信者法のために、一つだけを探しあなたは何をしても構いません。

これは、呼び出し元メソッドが別のクラスのものだと考えているので、必要に応じて調整してください。

0

これを強制する2つの一般的な方法があります。

実行時検査を実行する方法の1つはinitstopです。呼び出されると、スタックを調べ、呼び出し元を決定し、呼び出し元の注釈を反射的に判断し、呼び出し元にまたは@AfterSuiteという注釈がない場合は例外をスローします。これは間違った呼び出しを書くのを妨げるものではありません。間違った呼び出しを書き込んだ場合、テストスイートがクラッシュします。

もう1つの方法は静的チェックです。 initまたはstopを呼び出すメソッドをコンパイルするとき、メソッドに@BeforeSuiteまたは@AfterSuiteの注釈が付けられていないと、コンパイラはエラーを発行します。これにより、コンパイル時にエラーの通知が早期に行われ、誤ったコードを実行することを防ぐことができます。これを実装するには、Checker Frameworkなどのツールを使用してアノテーションプロセッサを作成するか、error-proneのようなツールにプラグインを作成します。

関連する問題