J'essaie de tester ma couche DAO (qui est construite sur JPA) dans la séparation. Dans le test unitaire, j'utilise DbUnit pour remplir la base de données et Spring Test pour obtenir une instance de ApplicationContext.Problèmes d'utilisation de DbUnit avec Spring TestContext
Lorsque j'ai essayé d'utiliser SpringJunit4ClassRuner, le ApplicationContext a été injecté, mais la méthode getDataSet() de DbUnit n'a jamais été appelée.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/testdao.xml")
public class SimpleJPATest extends DBTestCase implements ApplicationContextAware {
...
Alors j'ai essayé de supprimer l'annotation @RunWith, qui a supprimé les problèmes avec la méthode getDataSet(). Mais maintenant, je n'injecte plus l'instance ApplicationContext. J'ai essayé d'utiliser l'annotation @TestExecutionListeners, qui est supposée configurer le DependencyInjectionTestExecutionListener par défaut, mais l'AppContext n'est toujours pas injecté.
@TestExecutionListeners
@ContextConfiguration(locations = "/testdao.xml")
public class SimpleJPATest extends DBTestCase implements ApplicationContextAware {
...
Quelqu'un a-t-il des idées? Est-ce généralement une mauvaise idée de combiner ces deux cadres?
EDIT: voici le reste de la source pour la classe de test:
@TestExecutionListeners
@ContextConfiguration(locations = "/testdao.xml")
public class SimpleJPATest extends DBTestCase implements ApplicationContextAware {
static final String TEST_DB_PROPS_FILE = "testDb.properties";
static final String DATASET_FILE = "testDataSet.xml";
static Logger logger = Logger.getLogger(SimpleJPATest.class);
private ApplicationContext ctx;
public SimpleJPATest() throws Exception {
super();
setDBUnitSystemProperties(loadDBProperties());
}
@Test
public void testSimple() {
EntityManagerFactory emf = ctx.getBean("entityManagerFactory", EntityManagerFactory.class);
EntityManager em = emf.createEntityManager();
GenericDAO<Club> clubDAO = new JpaGenericDAO<Club>(ClubEntity.class, "ClubEntity", em);
em.getTransaction().begin();
Collection<Club> allClubs = clubDAO.findAll();
em.getTransaction().commit();
assertEquals(1, allClubs.size());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
private void setDBUnitSystemProperties(Properties props) {
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
props.getProperty("db.driver"));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
props.getProperty("db.url"));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
props.getProperty("db.username"));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
props.getProperty("db.password"));
}
private Properties loadDBProperties() throws Exception {
URL propsFile = ClassLoader.getSystemResource(TEST_DB_PROPS_FILE);
assert (propsFile != null);
Properties props = new Properties();
props.load(propsFile.openStream());
return props;
}
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new HsqldbDataTypeFactory());
}
@Override
protected DatabaseOperation getSetUpOperation() throws Exception {
return DatabaseOperation.CLEAN_INSERT;
}
@Override
protected DatabaseOperation getTearDownOperation() throws Exception {
return DatabaseOperation.DELETE_ALL;
}
@Override
protected IDataSet getDataSet() throws Exception {
logger.debug("in getDataSet");
URL dataSet = ClassLoader.getSystemResource(DATASET_FILE);
assert (dataSet != null);
FlatXmlDataSet result = new FlatXmlDataSetBuilder().build(dataSet);
return result;
}
}
La raison pour laquelle aucune des méthodes DbTestCase n'est appelée est sans aucun doute le fait que la classe DbTestCase utilise l'API JUnit 3.8 et que j'essaie de m'exécuter avec SpringJUnit4ClassRunner. – prasopes
J'ai réussi à utiliser DbUnit avec JUnit 4. Ce billet de blog m'a beaucoup aidé (regarder à travers la source de quelques classes clés de DbUnit n'a pas fait de mal non plus). http://ralf.schaeftlein.de/2009/01/05/dbunit-with-junit-4x-and-spring-for-testing-oracle-db-application/ – prasopes