Primavera: ¿Por qué @Predestroy no se llama al final de cada clase de prueba? -- java campo con spring campo con spring-mvc campo con spring-junit campo con component-scan camp Relacionados El problema

Spring: Why is @PreDestroy not called at end of each test class?


5
vote

problema

Español

Tengo una clase de prueba de integración anotada de la siguiente manera

  @WebAppConfiguration @ContextConfiguration(classes = {AppConfiguration.class}) @RunWith(SpringJUnit4ClassRunner.class)     public class CacheConsumerTest {  }   

Aquí está mi convenfiguración

  @Configuration     @ComponentScan(basePackages = {"com.etc.etc.etc."}) @EnableWebMvc public class AppConfiguration { }   

Por alguna razón, ninguno de mis @Component Frijoles ' @PreDestroy se llama al final de todas las pruebas en CacheConsumerTest . @PostConstruct está llamado al inicio, antes de que se ejecuten las pruebas.

¿Alguien sabe cuál puede ser el problema? Algunos de mi @Component son hilos de fondo que me gustaría apagar (llamando a @Predestroy llamado), de lo contrario, el trabajo que realizan en el fondo hará que las pruebas posteriores en otras clases de prueba falle.

He intentado agregar @DirtiesContext(classMode=ClassMode.AFTER_CLASS) pero no ayudó.

Editar: descubrió el problema, tuve que hacer un paso adicional para hacer que la suctiesContext funcione: ¿El resorte @dirtiescontext recarga el contexto de resorte?

Original en ingles

I have an integration test class annotated as follows

@WebAppConfiguration @ContextConfiguration(classes = {AppConfiguration.class}) @RunWith(SpringJUnit4ClassRunner.class)     public class CacheConsumerTest {  } 

Here's my AppConfiguration

@Configuration     @ComponentScan(basePackages = {"com.etc.etc.etc."}) @EnableWebMvc public class AppConfiguration { } 

For some reason, none of my @Component beans' @PreDestroy is getting called at the end of all tests in CacheConsumerTest. @PostConstruct is however being called at the start, before any tests are run.

Anyone know what the problem may be? Some of my @Component are background threads that I would like to have shut off (by having its @Predestroy called), otherwise the work they do in the background will cause subsequent tests in other test classes to fail.

I've tried adding @DirtiesContext(classMode=ClassMode.AFTER_CLASS) but it didn't help.

EDIT: Figured out the problem, I had to do an additional step to make DirtiesContext work: Does Spring @DirtiesContext reload Spring context?

              

Lista de respuestas

8
 
vote

SpringJUnit4ClassRunner tiene una característica: Caches Caches Todos empezaron los contextos y los destruyen solo al final de la ejecución de todos los casos de prueba. La razón es que a menudo comienzan de nuevo contexto de primavera puede tardar varios segundos que aumenta significativamente el tiempo necesario para su suite.

Por lo tanto, si realmente necesita esto, probablemente debería extender SpringJUnit4ClassRunner y no lo haga para almacenar en caché los contextos. Supongo que probablemente este corredor ya tiene tal característica, pero desafortunadamente no puedo ver esto ahora mismo. Intenta examinar su código. No es tan complicado y probablemente encontrará la solución rápidamente.

Editar:

Acaba de anotar su caso de prueba con @DirtiesContext . Eche un vistazo aquí < / a> para más detalles.

 

SpringJUnit4ClassRunner has a feature: it caches all started contexts and destroys them only at the end of running of all test cases. The reason is that often starting of new spring context may take several seconds that significantly increases the time needed for whole suite.

So, if you really need this you probably should extend SpringJUnit4ClassRunner and make it not to cache the contexts. I guess that probably this runner already has such feature but unfortunately I cannot check this right now. Try to examine its code. It is not so complicated and probably you will find the solution quickly.

EDIT:

Just annotated your test case with @DirtiesContext. Take a look here for details.

 
 

Relacionados problema

0  Contexto: el componente-escaneo no se puede definir  ( Contextcomponent scan cannot be defined ) 
Estoy teniendo un problema con las definiciones de contextos de primavera. Cuando miro a otras personas que tuvieron este problema, normalmente fue porque usi...

2  ¿ComponentesCan y enumerados no funcionan para el proyecto de primavera dependiente?  ( Componentscan and autowired not working for dependent spring project ) 
Tengo dos proyectos A y B. Ambos están construidos con Maven, y el proyecto A tiene una dependencia de Maven al Proyecto B. Ambos proyectos tienen una clase c...

190  Múltiples paquetes en contexto: componente-escaneo, configuración de resorte  ( Multiple packages in contextcomponent scan spring config ) 
¿Cómo puedo agregar múltiples paquetes en el archivo Spring-servlet.xml en template: '/sometemplate.html', controller: 'someCtrl' 0 element? He intentado ...

2  Documentación de primavera para la exploración de componentes versus configuración  ( Spring documentation for component scan versus configuration ) 
He buscado una respuesta a esta pregunta, pero mi búsqueda Voodoo debe estar un poco apagado. En el trabajo, he notado que hay una preferencia para usar la ...

4  ¿Por qué la herencia de la clase de la primavera @configuration no funciona como se esperaba?  ( Why is spring configuration class inheritance not working as expected ) 
Tengo una clase de configuración abstracta de primavera que incluye un frijol común: public abstract class AbstractConfig { @Bean public CommonBean...

56  GetServletConfigclasses () vs getrootconfigclasses () cuando se extiende la abstracciónannotationconfigdispatcherservletinitializer  ( Getservletconfigclasses vs getrootconfigclasses when extending abstractannot ) 
¿Cuál es la diferencia entre - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)2 - (UITableViewCell *)tableView...

0  Error de ERRESCOSERVICE.CREATEPERSONO al usar el componente de resorte-Scan  ( Alfresco personservice createperson error when using spring component scan ) 
Hace algunas semanas, desarrollé un amplificador basado en Alfresco 3.4.14. En ese módulo, creé algunos servicios personalizados. Uno de los servicios se util...

1  Cómo evitar configurar una biblioteca externa por otra biblioteca con arranque de primavera  ( How to avoid to configure an external library by another library using spring bo ) 
Supongamos que tengo dos proyectos de arranque de primavera. El primer proyecto es solo una biblioteca de apoyo que proporciona varias funcionalidades. El seg...

0  ¿Cómo se detectan las clases anotadas a @ configurationproperties que se detectan automáticamente con la anotación @springbootapplication  ( How is configurationproperties annotated classes detected automatically with s ) 
Estoy aprendiendo el arranque de primavera y tengo una pregunta con un ejemplo en la documentación de referencia. Siguiendo la sección de documentación menc...

3  Boot de primavera: NUNUNQUEBEANDEFINITIONEXCEPE ENTRE LA PRUEBA Y PRINCIPAL  ( Spring boot nouniquebeandefinitionexception between test and main ) 
Tengo una clase principal / application.java clase @SpringBootApplication @ComponentScan(value = "com.nfl.dm.shield", excludeFilters = { ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos