用unitils,dbunit和spring进行单元测试

时间:2012-12-20 04:34:25

标签: spring junit unitils

我不熟悉unitils(内置dbunit)和spring。在我正在工作的新地方我可以看到一些测试是使用spring而其他测试是使用unitils / dbunit而没有spring。

推动使用弹簧,所以我一直试图合并以下功能。

Spring测试使用:

@RunWith(SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = { "classpath:spring-dev.xml" })
public class x(){
@Autowired
private ProfileDao profileDao;

@Test
@Rollback
@Transactional
public void shouldRetrieveProfileByUserNumber() {
    Profile profile = profileDao.retrieveProfile("u1", "0000003861", null);
    assertThat(profile.getUserNumber(), is("0000003861"));
}

这个类有@Autowired ProfileDao,它在使用@RunWith(SpringJUnit4ClassRunner.class)时有效。

Unitils测试使用:

@RunWith(UnitilsJUnit4TestClassRunner.class)
@DataSet("WEB_SERVICE_DATASET.xml")
public class ServiceExceptionTest {}

运行时正确加载数据库等。

我想要实现的是将这些组合起来,以便我可以使用@RunWith(UnitilsJUnit4TestClassRunner.class)注释“单元化”我的类,但也可以像上一课一样以正常方式使用spring

问题是我在使用spring版本时无法将我的课程统一起来,因为它们都是JUnit4ClassRunner扩展。

我尝试了各种各样的变化,但一直无法工作。

任何人都可以建议这样做吗?

由于

2 个答案:

答案 0 :(得分:4)

Unitils实际上没有适当的Spring集成支持。

请改为查看spring-test-dbunit

答案 1 :(得分:3)

Unitils有一个Spring集成包:

org.unitils:unitils-spring:3.3

我们不必从Spring测试迁移,但确实一起使用Spring和Unitils。我们不是使用@RunWith注释,而是继承:

import org.unitils.UnitilsJUnit4;
import org.unitils.dbunit.annotation.DataSet;
import org.unitils.spring.annotation.SpringBean;
import org.unitils.spring.annotation.SpringApplicationContext;

@SpringApplicationContext({"main-context.xml", "test-context.xml"})
@DataSet
public class ServiceTest extends UnitilsJUnit4 {

  @SpringBean("ourServiceBean")
  OurService ourService;

  @Test
  public void someTest() throws Exception {
  }
}

我们最近遇到了第一次没有正确加载测试数据的问题。这可能是Unitils和Spring事务处理之间的冲突。我不太确定,但通过设置此属性来关闭Unitils中的事务:

DatabaseModule.Transactional.value.default=disabled
在unitils.properties文件中

解决了这个问题。