Pas de bean nommé 'org.springframework.contexte.annotation.ConfigurationClassPostProcessor.importRegistry " est défini
je suis en train de lancer un package complet de test junit classes, et j'ai un audit des classes pour mes classes de domaine comme suit:
@PrePersist
public void prePersist(AuditableEntity e) {
UserService userService = SpringBeanFactory.getBean(UserService.class);
//some auditing here
}
- SpringBeanFactory classe:
public class SpringBeanFactory {
private static ApplicationContext applicationContext;
public static <T> T getBean(final String name, final Class<T> requiredType) {
T bean = null;
if (applicationContext != null) {
bean = applicationContext.getBean(name, requiredType);
}
return bean;
}
public static <T> T getBean(final Class<T> requiredType) {
T bean = null;
if (applicationContext != null) {
bean = applicationContext.getBean(requiredType);
}
return bean;
}
public static void setApplicationContext(final ApplicationContext applicationContext) {
if (SpringBeanFactory.applicationContext == null) {
SpringBeanFactory.applicationContext = applicationContext;
}
}
}
-Classe de Test config:
@Autowired
private ApplicationContext applicationContext;
@Before
public void before() throws Exception {
SpringBeanFactory.setApplicationContext(applicationContext);
}
-SpringTestingConfig classe:
@Configuration
@ComponentScan(basePackages = "com.myapp.data", excludeFilters = { @Filter(Configuration.class) })
@PropertySource("classpath:/test.properties")
@Profile("test")
public class SpringTestingConfig {
private static Logger log = (Logger)LoggerFactory.getLogger(SpringTestingConfig.class);
@Autowired
private ApplicationContext applicationContext;
@Bean
public DataSource XdataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
if(log.isDebugEnabled()) log.debug("profile.name", "test");
System.setProperty("profile.name", "test");
dataSource.setDriverClassName("org.h2.Driver");
String schemaName = ConfigurationUtil.config().getString("db.schema.name").toLowerCase();
log.debug("SCHEMA IS " + schemaName);
String url = "jdbc:h2:mem:test;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS " +schemaName +"\\;" + "SET SCHEMA "+schemaName;
dataSource.setUrl(url);
//dataSource.setUrl("jdbc:h2:mem:test;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS " + schemaName);
dataSource.setUsername("sa");
//use your own local mysql in tests here...
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://localhost:3306/mv_tests?characterEncoding=UTF-8");
// dataSource.setUsername("tomcat");
// dataSource.setPassword("tomcat");
//
return dataSource;
}
@Bean
public DataSource dataSource() {
SpringBeanFactory.setApplicationContext(applicationContext);
LoggerUtils.setAllApplicationLogs("DEBUG");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
if(log.isDebugEnabled()) {
log.debug("profile.name", "test");
}
System.setProperty("profile.name", "test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
String schemaName = ConfigurationUtil.config().getString("db.schema.name");
String username = ConfigurationUtil.config().getString("db.username");
String password = ConfigurationUtil.config().getString("db.password");
if( log.isDebugEnabled() ) {
log.debug( "SCHEMA IS " + schemaName );
log.debug( "Username IS " + username );
log.debug( "Password IS " + password );
}
dataSource.setUrl("jdbc:mysql://localhost:3306/"+schemaName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
-Classe de Test annotations:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ WebContextTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
@ActiveProfiles("test")
@DirtiesContext
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { SpringConfig.class, SpringTestingConfig.class, SpringLocalContainerJPAConfig.class, CustomConfiguration.class })
@Transactional
quand ma méthode d'essai tente d'enregistrer une entité, il fait appel à PrePersist méthode qui, à son tour, fait appel à l'arriver du printemps de service:
UserService userService = SpringBeanFactory.getBean(UserService.class);
qui à son tour produit de l'exception suivante:
Error creating bean with name 'userService':
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private com.motivosity.data.repository.UserRepository com.motivosity.service.impl.UserServiceImpl.userRepository;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepositoryImpl':
Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'springLocalContainerJPAConfig': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field:
javax.sql.DataSource com.motivosity.data.config.SpringLocalContainerJPAConfig.dataSource;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'springTestingConfig': Initialization of bean failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration':
Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined
je dois mentionner que cette exception se produit lors de l'exécution d'un package complet de classes de test, mais lors de l'exécution de cette classe de test séparément, aucune exception n'est produite.
BTW, je suis en utilisant printemps 3.2.3.COMMUNIQUÉ de
Mise à JOUR: lorsque j'ai mis à jour le printemps version à la dernière version 4.0.3, je reçois une nouvelle exception sur le même obtenir UserService ligne:
org.springframework.context.support.GenericApplicationContext@3aa54263 has been closed already
veuillez informer comment le réparer de cette exception.
OriginalL'auteur Mahmoud Saleh | 2014-05-10
Vous devez vous connecter pour publier un commentaire.
Lorsque vous annotez une classe de test ou de la méthode de test avec
@DirtiesContext
, en vous disant Printemps à près laApplicationContext
après que la classe de test ou de la méthode. Ainsi, si vous tentez de récupérer un bean à partir d'un fermé contexte, vous aurez une exception, comme vous voyez.Ma conjecture est que vous utilisez
@DirtiesContext
dans d'autres classes de test au sein de votre suite de tests, et à la suite de la logique dansSpringBeanFactory.setApplicationContext()
est cassé car il peut potentiellement maintenir une référence à un contexte. Ainsi, vous aurez besoin de permettre à l' actuelApplicationContext
à définir pour chaque test. En d'autres termes, supprimer lanull
-vérifier comme suitEspérons que cette aide!
- Sam (auteur de la Spring Framework TestContext)
@DirtiesContext
de mes classes de test et de définirSpringBeanFactory.setApplicationContext(applicationContext);
dans chaque classe de test.OriginalL'auteur Sam Brannen