1

我是unitils(内置dbunit)和spring的新手。在我工作的新地方,我可以看到一些测试是使用 spring 的,而其他测试则使用不带 spring 的 unitils/dbunit。

有一个使用弹簧的推动力,所以我一直在尝试合并以下功能。

弹簧测试使用:

@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) 注释“Unitil'ise”我的课程,但也可以像上一个课程一样以正常方式使用 spring。

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

我尝试了各种变体,但都无法正常工作。

任何人都可以建议一种体面的方式吗?

谢谢

4

2 回答 2

4

Unitils 并没有真正提供适当的 Spring 集成支持。

看看spring-test-dbunit

于 2013-02-03T21:32:19.183 回答
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 文件中解决了这个问题。

于 2013-04-29T14:14:16.163 回答