2016-05-11 16 views
1

Java TestNgリスナーメソッドonFinish()に重複コードがあり、それを関数内で分離して2回呼び出すことができます。ここで以下の私の方法であって、その上記方法から分かるようJava共通メソッド/関数(重複コード用)

@Override 
    public void onFinish(ITestContext testContext) { 
    HashMap<Object, Object> map = new HashMap<Object,Object>(); 
     Object key_id = new Object(); 
     map.put(key_id, "id"); 
     Object key_result = new Object(); 
     map.put(key_result, "result"); 

     //Check for all the FAILED tests 
     for (ITestResult failedTest : testContext.getFailedTests().getAllResults()) { 
      Method method = failedTest.getMethod().getConstructorOrMethod().getMethod(); 
      TestInfo annotation = method.getAnnotation(TestInfo.class); 
      try { 
       if(annotation!=null) { 
        for(String test_id: annotation.id()) { 
         map.put(map.get(key_result), Status.AUTOFAIL.getValue()); 
         Integration.addTestResult(map); 
        } 
       } catch (SecurityException | IOException 
        | TestRailApiException | NullPointerException e) { 
       TestLogger.logError("Failed to find the annotation"); 
      } 
     } 

    //Check for all the SKIPPED tests 
     for (ITestResult skippedTest : testContext.getSkippedTests().getAllResults()) { 
      Method method = skippedTest.getMethod().getConstructorOrMethod().getMethod(); 
      TestInfo annotation = method.getAnnotation(TestInfo.class); 
      try { 
       if(annotation!=null) { 
        for(String test_id: annotation.id()) { 
         map.put(map.get(key_result), Status.AUTOSKIP.getValue()); 
         Integration.addTestResult(map); 
        } 
       } catch (SecurityException | IOException 
        | TestRailApiException | NullPointerException e) { 
       TestLogger.logError("Failed to find the annotation"); 
      } 
     } 

がループ用の2つのとの間の唯一の違いは、私は最初の失敗したテストを確認し、別のループでテストをスキップします。内部的な違いは、まずAUTOFAILをテストのステータスとしてプッシュし、次にスキップしたすべてのテストに対してAUTOSKIPをプッシュします。

よく分かっているように、共通の機能でこれを分けて、その機能をAUTOFAILAUTOSKIPに送信するようにしたいと思います。

+1

これはいい考えです。何を試しましたか? –

+0

私はそれぞれ失敗したテストとスキップしたテストの2つの別々の関数を作成しましたが、共通の関数が必要です。また、 'map.put(map.get(key_result)、Status.'AUTOSKIP'.getValue());'そして...「AUTOFAIL」は私が別の機能としてそれを作ることを許していない共通点を持つ必要があります。 –

答えて

2

別の方法にループを展開し、オーバーループしているもので、それをパラメータ:

void loop(Collection<ITestResult> results, Status status){ 
    for(ITestResult result : results){ 
     (... use status here ...) 
    } 
} 

としてそれを呼び出す:もちろんloop(testContext.getFailedTests().getAllResults(), Status.AUTOFAIL)loop(testContext.getSkippedTests().getAllResults(), Status.AUTOSKIP)

、それはすべての改善あなたではありませんここで作ることができますが、これはあなたの元の質問を解決する、私は信じています。