2017-08-28 36 views
1

基本的には、私はリフレクションによって変更したContextクラスの定数ブール値属性を使用したいので、testNGメソッドに対して@annotatedを有効に設定できますTestNGクラス。 TestNGクラスには、Context.DISBLE_TEST_CASES_IF_OLD_STACKと同じ静的final属性があります。私はTestNGクラスとそのメソッドのために以下のコードを貼り付けました。注釈属性Test.enabledの値は定数式でなければなりません

package com.abc.api.test.tests.TestA; 

import com.abc.api.core.context.Context; 

public class TestA extends TestCommon { 

    private static final boolean ENABLE_DISABLE = Context.DISBLE_TEST_CASES_IF_OLD_STACK; 

    /** 
    * 
    */ 
    @BeforeTest 
    void setPropertiesFile() { 
     ...... 

    } 

    /** 
    * PATCH Positive Test Cases 
    * 
    */ 

    @Test(priority = 11, enabled=ENABLE_DISABLE) 
    public void testPositive1() { 
     ...... 
    } 
} 
+2

あなたの 'DISBLE_TEST_CASES_IF_OLD_STACK'は定数変数ではありません。アノテーションではこれを使用できません。 –

+0

しかし、実際にはクラスの定数属性である静的最終値を本質的に変更することは反射ではありません。それで、私は反射を使ってこの道を歩みました。 –

+2

https://stackoverflow.com/questions/10636201/java-annotations-values-provided-in-dynamic-manner –

答えて

2

私のための最終的な目標は、その古い環境や新しい環境

package com.abc.api.core.context; 

    import java.lang.reflect.Field; 
    import java.lang.reflect.Modifier; 


    public class Context { 
     public static final boolean DISBLE_TEST_CASES_IF_OLD_STACK = getConstantReflection(); 


     public static boolean getConstantReflection() 
     { 
      System.out.println(DISBLE_TEST_CASES_IF_OLD_STACK); 
      try { 
       setEnableFlagBasedOnStackForTestCases(); 
      } catch (NoSuchFieldException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println(Context.DISBLE_TEST_CASES_IF_OLD_STACK); 
      try { 
       final Field fld = Context.class.getDeclaredField("DISBLE_TEST_CASES_IF_OLD_STACK"); 
       return (Boolean) fld.get(null); 
      } catch (NoSuchFieldException e) { 
       return (Boolean) null; 
      } catch (IllegalAccessException e) { 
       return (Boolean) null; 
      } 
     } 

     private static void setEnableFlagBasedOnStackForTestCases() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 


      Field f = Context.class.getDeclaredField("DISBLE_TEST_CASES_IF_OLD_STACK"); 
      f.setAccessible(true); 

      //'modifiers' - it is a field of a class called 'Field'. Make it accessible and remove 
      //'final' modifier for our 'CONSTANT' field 
      Field modifiersField = Field.class.getDeclaredField("modifiers"); 
      modifiersField.setAccessible(true); 
      modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); 

      if (TestcaseContext.getContext().equalsIgnoreCase(Context.OLD_STACK)) { 
       f.setBoolean(null, false); 
      }else { 
       f.setBoolean(null, true); 
      } 
     } 

    } 

TestNGのクラスとメソッドの例ならば、コンテキストに基づいたテストを有効に値を切り替えるか、基本的に無効にすることですテストケースを選択的に無効にするという最終目標として、TestNgs IAnnotationTransformerを使用して有効フラグを制御できます。 @Test注釈付きメソッドの前に実行され、実行を制御できます。

例えば、

public class DemoTransformer implements IAnnotationTransformer { 
    public void transform(ITest annotation, Class testClass, 
     Constructor testConstructor, Method testMethod) 
    { 
    if (condition) { 
     annotation.setEnabled(false/true); 
    } 
} 
+0

まさに私がやったことです。しかし、何らかの理由でTestNGクラスにリスナークラスで注釈を付けると、リスナーは呼び出されませんでした。テストスイートでxmlを通じてリスナーを使用する必要がありました。これは、このリスナーをこの特定のクラスだけに適用したいので、ちょっとしたものです。また、グループを使い、必要に応じてグループを除外して含めることができます。 –

関連する問題