Necesito usar extensiones para ejecutar el código antes y después de todos los casos de prueba en las clases que lo usan. Mis clases de prueba necesitan acceder a un campo en mi clase de Extensión. es posible?
Dado:
@ExtendWith(MyExtension.class) public class MyTestClass { @Test public void test() { // get myField from extension and use it in the test } }y
public class MyExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { private int myField; public MyExtension() { myField = someLogic(); } ... } ¿Cómo accedo a myField desde mi clase de prueba?
Puede lograr esto a través de una anotación de marcador y una extensión BeforeEachCallback .
Cree una anotación de marcador especial, por ejemplo
@Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface MyField { }Use la anotación para encontrar y establecer los valores desde dentro de la extensión:
import org.junit.jupiter.api.extension.BeforeEachCallback; public class MyExtension implements BeforeEachCallback { @Override public void beforeEach(final ExtensionContext context) throws Exception { // Get the list of test instances (instances of test classes) final List<Object> testInstances = context.getRequiredTestInstances().getAllInstances(); // Find all fields annotated with @MyField // in all testInstances objects. // You may use a utility library of your choice for this task. // See for example, https://github.com/ronmamo/reflections // I've omitted this boilerplate code here. // Assign the annotated field's value via reflection. // I've omitted this boilerplate code here. } }Luego, en sus pruebas, anota el campo de destino y amplía la prueba con su extensión:
@ExtendWith(MyExtension.class) public class MyTestClass { @MyField int myField; @Test public void test() { // use myField which has been assigned by the extension before test execution } } Nota: alternativamente, puede extender BeforeAllCallback que se ejecuta una vez antes de todos los métodos de prueba de la clase, según sus requisitos reales.