Permettra à l'autowiring pas de travail au Printemps 3.1.2, JUnit 4.10.0
À l'aide de Printemps 3.1.2, JUnit 4.10.0, et assez nouveau pour les deux versions. Je vais avoir le problème que je ne peux pas obtenir l'annotation de base permettra à l'autowiring de travail.
Ci-dessous sont deux échantillons, l'un de pas à l'aide d'annotations, qui fonctionne bien. Et le second en utilisant l'annotation, qui ne fonctionne pas, et je ne trouve pas la raison. J'ai suivi les échantillons spring-mvc-test assez bien.
De travail:
package com.company.web.api;
//imports
public class ApiTests {
@Test
public void testApiGetUserById() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/company/web/api/ApiTests-context.xml");
UserManagementService userManagementService = (UserManagementService) ctx.getBean("userManagementService");
ApiUserManagementController apiUserManagementController = new ApiUserManagementController(userManagementService);
MockMvc mockMvc = standaloneSetup(apiUserManagementController).build();
//The actual test
mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
}
}
À défaut, parce que userManagementService
est nulle, de ne pas arriver autocâblés:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration //should default to ApiTests-context.xml in same package
public class ApiTests {
@Autowired
UserManagementService userManagementService;
private MockMvc mockMvc;
@Before
public void setup(){
//SetUp never gets called?!
}
@Test
public void testGetUserById() throws Exception {
//!!! at this point, userManagementService is still null - why? !!!
ApiUserManagementController apiUserManagementController
= new ApiUserManagementController(userManagementService);
mockMvc = standaloneSetup(apiUserManagementController).build();
//The actual test
mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
}
}
Noter que les deux classes de test ci-dessus devraient être en utilisant le même contexte, la configuration et l'userManagementService est défini.
ApiTests-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="user"/>
<property name="password" value="passwd"/>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
p:dataSource-ref="dataSource" p:mappingResources="company.hbm.xml">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</entry>
</map>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>
<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
<context:annotation-config/>
<tx:annotation-driven/>
<context:mbean-export/>
<!-- tried both this and context:component-scan -->
<!--<bean id="userManagementService" class="com.company.web.hibernate.UserManagementServiceImpl"/>-->
<context:component-scan base-package="com.company"/>
<!-- Hibernate's JMX statistics service -->
<bean name="application:type=HibernateStatistics" class="org.hibernate.jmx.StatisticsService" autowire="byName"/>
</beans>
et la UserManagementService (interface) ainsi que UserManagementServiceImpl a la @Service
annotation.
Deux petites questions/observations: setup() n'est jamais appelée, même si elle a le @Avant d'annotation. En outre, j'ai remarqué que mes méthodes d'essai n'est pas exécuté/reconnu si ils ne commencent pas par le nom de "test", ce qui n'est pas le cas avec tous les spring-mvc-échantillons de test que j'ai vu.
pom.xml:
<dependency>
<groupId>org.junit</groupId>
<artifactId>com.springsource.org.junit</artifactId>
<version>4.10.0</version>
<scope>test</scope>
</dependency>
Mise à jour:
Le problème se produit uniquement lorsque j'exécute les tests de maven; c'est ok, quand je lance le test à partir de l'intérieur de mon IDE (IntelliJ IDEA).
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.3</version>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
@ContextConfiguration("classpath:com/company/web/api/ApiTests-context.xml")
post le contexte complet s'il vous plaît. publiez aussi vos pom car il semble que vous êtes en utilisant junit 3 en quelque sorte ?
L'ai déjà essayé, pas de différence. @ContextConfiguration(lieux={"classpath:company/com/web/api/ApiTests-context.xml"})
Vous trouverez le contexte ci-dessus, et aussi le pom.xml extrait, c'est Junit4.
Quel est l'indicateur que vous pensez que c'est junit3 au lieu de 4? Parce que des annotations d'être ignoré?
OriginalL'auteur Mathias Conradt | 2012-09-21
Vous devez vous connecter pour publier un commentaire.
Permettra à l'autowiring n'arrivera jamais, sauf si vous avez un composant d'analyse.
Pourquoi avez-vous commenté dans ton code ?
Également re:junit. Si vous êtes dans eclipse, vous pouvez simplement aller à la dépendance de l'arborescence de la pom et d'un filtre à junit. Vérifiez que vous êtes en train d'utiliser cette version et pas en tirant dans une ancienne junit.
Edit: Ok je viens de vérifier votre config et a été en mesure de le faire de ce côté. Mon seulement deviner, peut-être, c'est que vous êtes en quelque sorte de l'exécution avec un mauvais test runner qui est à l'origine d'utiliser le mauvais junit.
Edit 2 (RÉSOLU): Ainsi, il s'avère que le problème est parce que vous utilisez une version personnalisée de junit. Surefire regarde l'junit bibliothèque et ne peux pas le trouver. En conséquence, il est par défaut junit 3, qui est ce que les causes de votre application pour passer en chargeant le fichier de configuration.
Vous pouvez spécifier explicitement le fournisseur personnalisé comme
Mais j'ai trouvé que cela ne fonctionne pas bien avec le custom repos. Si possible, j'aimerais vous suggérons d'utiliser la version standard de junit.
J'ai changé au-dessus de questions/code component-scan (pas commenté) de nouveau. Comme mentionné, j'ai essayé cela avant, mais toujours pas de succès).
J'utilise SpringJUnit4ClassRunner - entendez-vous cela? C'est celui qu'il utilise partout rstoyanchev.github.com/spring-31-and-mvc-test/#26
+1 pour autant d'efforts pour les aider, bien trouvé
ça fonctionne très bien. Merci encore pour votre effort.
OriginalL'auteur MikePatel
Essayer contexte spécifique de configuration, par exemple
(il suffit de montrer comment cela peut être utilisé avec plusieurs fichiers si nécessaire - on peut être assez)
Edit: avez-vous activé AutowiredAnnotationBeanPostProcessor comme mentionné ici? http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/
OriginalL'auteur Brian
J'ai eu ce même problème. Mon @Autowire serait de travailler dans mon IDE (SpringSource STS) mais il ne parvient pas à charger le contexte de l'application quand je l'utilise Maven pour construire à partir de la ligne de commande.
Le problème était avec mon dépendances dans le pom.xml. J'ai été en utilisant la version de Printemps JUnit qui a provoqué l'erreur. Je pense que c'est la cause du message d'origine. Je n'ai pas de code tout plugin Maven pour ce travail.
J'ai changé
à
OriginalL'auteur bMcNees