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&amp;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>

Autowiring nicht arbeiten im Frühjahr 3.1.2, JUnit 4.10.0

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

Schreibe einen Kommentar