web-dev-qa-db-fra.com

Le ressort n'est pas automatique dans les tests unitaires avec JUnit

J'ai testé le DAO suivant avec JUnit:

@Repository
public class MyDao {

    @Autowired
    private SessionFactory sessionFactory;

    // Other stuff here

}

Comme vous pouvez le constater, la sessionFactory est automatiquement câblée à l'aide de Spring. Lorsque j'exécute le test, sessionFactory reste null et j'obtiens une exception de pointeur null.

Voici la configuration sessionFactory dans Spring:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

Qu'est-ce qui ne va pas? Comment puis-je activer le câblage automatique pour les tests unitaires?

Mise à jour: je ne sais pas si c'est le seul moyen d'exécuter des tests JUnit, mais notez que je l'exécute dans Eclipse en effectuant un clic droit sur le fichier de test et en sélectionnant "exécuter en tant que" -> "test JUnit".

38
user1883212

Ajoutez quelque chose comme ceci à votre classe de test d'unité racine:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration

Cela utilisera le XML dans votre chemin par défaut. Si vous devez spécifier un chemin autre que celui par défaut, vous pouvez fournir une propriété locations à l'annotation ContextConfiguration.

http://static.springsource.org/spring/docs/2.5.6/reference/testing.html

29
robert_difalco

Vous devez utiliser le coureur Spring JUnit pour câbler des haricots Spring de votre contexte. Le code ci-dessous suppose que vous avez un contexte d'application appelé testContest.xml disponible sur le classpath de test.

import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import Java.sql.SQLException;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.startsWith;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:**/testContext.xml"})
@Transactional
public class someDaoTest {

    @Autowired
    protected SessionFactory sessionFactory;

    @Test
    public void testDBSourceIsCorrect() throws SQLException {
        String databaseProductName = sessionFactory.getCurrentSession()
                .connection()
                .getMetaData()
                .getDatabaseProductName();
        assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL"));
    }
}

Note: Cela fonctionne avec Spring 2.5.2 et Hibernate 3.6.5

8
Mike Rylander

L'emplacement du fichier de contexte manquant dans la configuration peut causer ceci, une approche pour résoudre ceci:

  • Spécification de l'emplacement du fichier de contexte dans ContextConfiguration

comme:

@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })

Plus de détails

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
public class UserServiceTest extends AbstractJUnit4SpringContextTests {}

Référence: Merci à @Xstian

6
Abhijeet

J'ai eu le même problème avec Spring Boot 2.1.1 et JUnit 4
vient d'ajouter ces annotations:

@RunWith( SpringRunner.class )
@SpringBootTest

et tout s'est bien passé.

Pour le 5 juin:

@ExtendWith(SpringExtension.class)

source

3
Mcin

Vous devez ajouter des annotations à la classe Junit, en lui indiquant d'utiliser SpringJunitRunner. Ceux que vous voulez sont:

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)

Cela indique à Junit d'utiliser le fichier test-context.xml dans le même répertoire que votre test. Ce fichier doit être similaire au fichier context.xml que vous utilisez pour Spring, mais pointant vers le test des ressources, naturellement.

2
TrueDub