Junit: ejecuta el método de configuración una vez

Configuré una clase con un par de pruebas y en lugar de utilizar @Before me gustaría tener un método de configuración que se ejecute solo una vez antes de todas las pruebas. ¿Es posible con Junit 4.8?

Aunque estoy de acuerdo con @assylias que usar @BeforeClass es una solución clásica, no siempre es conveniente. El método anotado con @BeforeClass debe ser estático. Es muy inconveniente para algunas pruebas que necesitan instancia de caso de prueba. Por ejemplo, pruebas basadas en Spring que usan @Autowired para trabajar con servicios definidos en el contexto de spring.

En este caso, yo personalmente uso el setUp() regular setUp() anotado con la anotación @Before anotar y administro mi bandera boolean personalizada:

 private static boolean setUpIsDone = false; ..... public void setUp() { if (setUpIsDone) { return; } // do the setup setUpIsDone = true; } 

Puede usar la anotación BeforeClass :

 @BeforeClass public static void setUpClass() { //executed only once, before the first test } 

JUnit 5 ahora tiene una anotación @BeforeAll:

Indica que el método anotado debe ejecutarse antes que todos los métodos @Test en la clase o jerarquía de clases actual; análogo a JUnit 4’s @BeforeClass. Dichos métodos deben ser estáticos.

¡Las anotaciones del ciclo de vida de JUnit 5 parecen haber llegado finalmente a su fin! Puede adivinar qué anotaciones están disponibles sin siquiera mirar (por ejemplo, @BeforeEach @AfterAll)

Cuando setUp() está en una superclase de la clase de prueba, la respuesta aceptada se puede modificar de la siguiente manera:

 public abstract class AbstractTestBase { private static Class testClass; ..... public void setUp() { if (this.getClass().equals(testClass)) { return; } // do the setup - once per concrete test class ..... testClass = this.getClass(); } } 

Esto debería funcionar para un único método setUp() no estático, pero no puedo producir un equivalente para tearDown() sin desviarme hacia un mundo de reflexión compleja … ¡Bounty apunta a cualquiera que pueda!

Editar: Acabo de enterarme al depurar que la clase también está instanciada antes de cada prueba. Supongo que la anotación @BeforeClass es la mejor aquí.

También puede configurar el constructor, la clase de prueba es una clase después de todo. No estoy seguro de si es una mala práctica porque casi todos los demás métodos están anotados, pero funciona. Podrías crear un constructor como ese:

 public UT () { // initialize once here } @Test // Some test here... 

El ctor se llamará antes de las pruebas porque no son estáticas.

Mi solución sucia es:

 public class TestCaseExtended extends TestCase { private boolean isInitialized = false; private int serId; @Override public void setUp() throws Exception { super.setUp(); if(!isInitialized) { loadSaveNewSerId(); emptyTestResultsDirectory(); isInitialized = true; } } ... } 

Lo uso como una base de base para todas mis testCases.

Pruebe esta solución: https://stackoverflow.com/a/46274919/907576 :

con la anotación @BeforeAllMethods / @AfterAllMethods puede ejecutar cualquier método en la clase de prueba en un contexto de instancia, donde todos los valores inyectados están disponibles.