2010-11-22 49 views
2


我试图在分离测试我的DAO层(它是建立在JPA上)。在单元测试中,我使用DbUnit来填充数据库和Spring Test以获取ApplicationContext的实例。使用DbUnit与Spring TestContext的问题

当我尝试使用SpringJunit4ClassRuner时,ApplicationContext被注入,但DbUnit的getDataSet()方法从未被调用过。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "/testdao.xml") 
public class SimpleJPATest extends DBTestCase implements ApplicationContextAware { 
    ... 

然后我试图删除@RunWith注释,它删除了getDataSet()方法的问题。但现在我不再注入ApplicationContext实例了。我试图使用@TestExecutionListeners注解,它应该默认配置DependencyInjectionTestExecutionListener,但AppContext仍然不会注入。

@TestExecutionListeners 
@ContextConfiguration(locations = "/testdao.xml") 
public class SimpleJPATest extends DBTestCase implements ApplicationContextAware { 
    ... 

有没有人有任何想法?将这两个框架结合起来通常是一个糟糕的主意吗?


编辑:这里是源测试类的其余部分:

@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; 
    } 
} 
+0

DbTestCase方法没有被调用的原因毫无疑问是DbTestCase类使用JUnit 3.8 API的事实,我试图用SpringJUnit4ClassRunner运行。 – prasopes 2010-11-23 18:20:22

回答

2

我用这两个框架在一起,没有任何问题。我不得不做一些事情,从标准略有不同,虽然得到它的工作:

​​

我不得不做的事情多一点手动比我想的,但相同的情况,如果您尝试在Spring中使用JUnit参数化运行器(在这种情况下,您必须手动启动TextContext)。最重要的一点是,我重写了closeConnection()方法并将其留空。这将覆盖每次测试后关闭数据源连接的默认操作,这会增加不必要的时间,因为每次测试后必须重新打开连接。