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".
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
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
L'emplacement du fichier de contexte manquant dans la configuration peut causer ceci, une approche pour résoudre ceci:
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
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)
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.