Veer niet automatisch bedraden in unit tests met JUnit

Ik test de volgende DAO met JUnit:

@Repository
public class MyDao {
    @Autowired
    private SessionFactory sessionFactory;
    // Other stuff here
}

Zoals je kunt zien, is de sessionFactory automatisch bedraad met Spring. Als ik de test uitvoer, blijft sessionFactory null en krijg ik een null pointer-uitzondering.

Dit is de sessionFactory-configuratie in het voorjaar:

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

Wat is er aan de hand? Hoe kan ik autowiring ook inschakelen voor unittests?

Update: ik weet niet of dit de enige manier is om JUnit-tests uit te voeren, maar merk op dat ik het in Eclipse uitvoer door met de rechtermuisknop op het testbestand te klikken en “uitvoeren als”->”JUnit-test te selecteren “


Antwoord 1, autoriteit 100%

Voeg zoiets als dit toe aan uw root unit-testklasse:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration

Hiermee wordt de XML in uw standaardpad gebruikt. Als u een niet-standaard pad moet opgeven, kunt u een locatie-eigenschap opgeven voor de annotatie ContextConfiguration.

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


Antwoord 2, autoriteit 45%

Ik had hetzelfde probleem met Spring Boot 2.1.1 en JUnit 4
zojuist die annotaties toegevoegd:

@RunWith( SpringRunner.class )
@SpringBootTest

en alles ging goed.

Voor juni 5:

@ExtendWith(SpringExtension.class)

bron


Antwoord 3, autoriteit 29%

Ik gebruik JUnit 5 en voor mij was het probleem dat ik Testuit het verkeerde pakket had geïmporteerd:

import org.junit.Test;

Het vervangen door het volgende werkte voor mij:

import org.junit.jupiter.api.Test;

Antwoord 4, autoriteit 21%

Je moet de Spring JUnit runner gebruiken om Spring Beans vanuit jouw context te bedraden. De onderstaande code gaat ervan uit dat u een toepassingscontext met de naam testContest.xmlbeschikbaar heeft op het testklassenpad.

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"));
    }
}

Opmerking:dit werkt met Spring 2.5.2en Hibernate 3.6.5


Antwoord 5, autoriteit 14%

Ontbrekende locatie van contextbestand in configuratie kan dit veroorzaken, één manier om dit op te lossen:

  • De locatie van het contextbestand opgeven in ContextConfiguration

vind ik leuk:

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

Meer details

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

Referentie:Met dank aan @Xstian


Antwoord 6, autoriteit 7%

Je moet annotaties toevoegen aan de Junit-klasse, waarin staat dat deze de SpringJunitRunner moet gebruiken. Degene die je wilt zijn:

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

Dit vertelt Junit om het bestand test-context.xml te gebruiken in dezelfde map als je test. Dit bestand zou vergelijkbaar moeten zijn met de echte context.xml die u voor de lente gebruikt, maar natuurlijk verwijzend naar testbronnen.


Antwoord 7, autoriteit 2%

Ik had dit probleem ook en de reden was een ongeldige import voor @Test

Import verwijderen

import org.junit.Test;

en gebruik

import org.junit.jupiter.api.Test;

Other episodes