Fondamentalement, je voulais utiliser un attribut booléen constant de la classe Context que j'ai modifié par réflexion afin de pouvoir définir dynamiquement le @annotated activé pour une méthode testNG dans une classe TestNG. La classe TestNG a un attribut final statique qui est le même que Context.DISBLE_TEST_CASES_IF_OLD_STACK. J'ai collé le code ci-dessous pour la classe TestNG et sa méthode. L'objectif final pour moi est d'activer la valeur activée ou désactiver essentiellement le test en fonction du contexte si son ancien environnement ou nouvel environnementLa valeur de l'attribut d'annotation Test.enabled doit être une expression constante
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);
}
}
}
CLASSE testng ET exemple MÉTHODE:
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() {
......
}
}
Votre 'DISBLE_TEST_CASES_IF_OLD_STACK' n'est pas une variable constante. Vous ne pourrez pas l'utiliser dans une annotation. –
Mais la réflexion ne modifie pas essentiellement la valeur finale statique qui est en fait un attribut constant de la classe. Par conséquent, je suis passé par ce chemin d'utilisation de la réflexion. –
https://stackoverflow.com/questions/10636201/java-annotations-values-provided-in-dynamic-manner –