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)
Antwoord 3, autoriteit 29%
Ik gebruik JUnit 5 en voor mij was het probleem dat ik Test
uit 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.xml
beschikbaar 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;