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

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>

Permettra à l'autowiring pas de travail au Printemps 3.1.2, JUnit 4.10.0

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>
Qu'advient-il si vous utilisez l'annotation de style explicite nommé fichier de configuration @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