Autowiring nicht arbeiten im Frühjahr 3.1.2, JUnit 4.10.0
Mit Spring 3.1.2, JUnit 4.10.0, und ziemlich neu für beide Versionen. Ich habe das problem, dass ich nicht bekommen kann die annotation-basierte autowiring zu arbeiten.
Unten sind zwei Beispiele, die man nicht mit Anmerkungen, die ist in Ordnung. Und die zweite mithilfe von Anmerkungen, die nicht funktioniert, und ich finde nicht den Grund. Ich folgte dem Muster der spring-mvc-test ziemlich viel.
Arbeiten:
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());
}
}
Scheitern, weil userManagementService
null ist, nicht immer autowired:
@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());
}
}
Beachten Sie, dass beide test-Klassen, die oben sein sollte mit der gleichen Kontext-Konfiguration, und die userManagementService definiert wird, in es.
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>
und die UserManagementService (interface) sowie UserManagementServiceImpl hat die @Service
annotation.
Zwei kleine Fragen/Beobachtungen: setup() wird nie aufgerufen, obwohl es die @Before-annotation. Außerdem bemerkte ich, dass meine test-Methoden nicht ausgeführt werden/erkannt werden, wenn Sie nicht beginnen mit dem Namen 'test', das ist nicht der Fall, obwohl mit allen spring-mvc-test-Proben, die ich sah.
pom.xml:
<dependency>
<groupId>org.junit</groupId>
<artifactId>com.springsource.org.junit</artifactId>
<version>4.10.0</version>
<scope>test</scope>
</dependency>
Update:
Das problem tritt nur auf, wenn ich die tests ausführen von maven; es ist ok, wenn ich den test durchführen, die in meiner 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>
- Was passiert, wenn Sie die annotation-Stil mit eine ausdrückliche benannte Konfigurationsdatei
@ContextConfiguration("classpath:com/company/web/api/ApiTests-context.xml")
- poste den vollständigen Kontext bitte. auch Ihre pom, weil es klingt wie Sie mit junit 3 auch irgendwie ?
- Versuchte es auch schon, kein Unterschied. @ContextConfiguration(locations={"classpath:company/com/web/api/ApiTests-context.xml"})
- Hier finden Sie den vollständigen Kontext vor, und auch die pom.xml Auszug, es ist Junit4.
- Was ist der Indikator dafür, dass Sie denken, es ist junit3 statt 4? Wegen der Anmerkungen ignoriert?
- das Vertrauen ist der test in der name junit 3.
- Ich habe einen screenshot; wenn die Maus über das importieren von junit auch um die Abhängigkeiten, zeigt es junit4.
- Können Sie bestätigen, dass der mit dem spring-Klasse-Läufer ( Debuggen Sie den code, und überprüfen Sie die Ausführung stack ) ?
- lassen Sie uns weiter, diese Diskussion im chat
Du musst angemeldet sein, um einen Kommentar abzugeben.
Autowiring nicht passieren, es sei denn Sie tun eine Komponente scan.
Warum haben Sie kommentiert es mit deinem code ?
Auch re:junit. Wenn Sie in eclipse können Sie nur gehen, die Abhängigkeit der Baum-Ansicht des pom und filter auf junit. Überprüfen Sie, ob Sie sich tatsächlich mit dieser version, und nicht ziehen in eine ältere junit.
Edit: Ok ich habe gerade überprüft Eure config und war in der Lage, um es arbeiten zu dieser Seite. Meine nur erraten werden kann, ist, dass Sie irgendwie läuft es mit einem schlechten test-runner, die verursacht Sie verwenden die falsche junit.
Edit 2 (GELÖST): So stellt es sich heraus, dass das problem ist, da Sie eine benutzerdefinierte version von junit. Surefire sieht für die zur Verfügung gestellten junit-Bibliothek und kann nicht finden es. Als ein Ergebnis ist es standardmäßig junit 3, die ist, was bewirkt, dass Ihre app zu überspringen laden der config.
Können Sie ausdrücklich angeben, die benutzerdefinierten Anbieter wie
Aber ich habe festgestellt, dass es nicht gut funktioniert mit custom-repos. Wenn möglich, würde ich empfehlen die standard-version von junit.
Versuchen Sie den spezifischen Kontext der Konfiguration, z.B.
(nur zeigen, wie dieses verwendet werden kann, mit mehreren Dateien, wenn nötig - man kann genug sein)
Edit: hab Sie aktiviert AutowiredAnnotationBeanPostProcessor, wie Sie hier erwähnt? http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/
Hatte ich das gleiche problem. My @Autowire arbeiten würde, in meiner IDE (SpringSource STS) würde aber nicht geladen werden der Anwendungskontext, wenn ich mit Maven zu erstellen von der Befehlszeile aus.
Wurde das Problem mit meinen Abhängigkeiten in der pom.xml. Ich war mit dem Spring-version von JUnit, die den Fehler verursacht hat. Ich denke, das ist die Ursache für den ursprünglichen post. Ich habe nicht code jeder Maven plugin für Sie arbeiten.
Änderte ich
zu