Spring和JUnit注释测试:在单独的事务中创建fixture

Fra*_*ois 3 junit spring annotations hibernate

我正在使用Spring和JUnit测试我的Hibernate DAO.

我希望每个测试方法都以预先填充的DB开始,即Java对象已经保存在DB中,已经提交的Hibernate事务中.我怎样才能做到这一点?

使用@After和@Before,方法在与@Test和@Transactional装饰的方法相同的Hibernate事务中执行(在实际测试方法启动时,第一级缓存可能不会刷新).@BeforeTransaction和@AfterTransaction显然无法与Hibernate一起使用,因为除了@ Before/AfterTransaction之外,即使使用@Transactional注释方法,它们也不会创建事务.

有什么建议吗?

Tim*_*per 6

一种方法是使用事务方法将您的初始化逻辑外部化到外部服务,这些方法是从测试类中的@BeforeTransaction和@AfterTransaction注释方法执行的.

这种方法的另一个好处是初始化代码跨测试的可重用性.

例如,你可以使用像描述基于SpringJUnit4ClassRunner 这里是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"testContext.xml","services.xml"})
public class MyServiceTest {

    @Autowired    
    private TestDataService testDataService;

    @Before
    public void setUp(){
        testDataService.addTestData();
    }

    @Test
    public void testSomething() throws Exception {
         // ...
    }
}


public interface TestDataService {

    void addTestData();

}

public class TestDataServiceImpl implements TestDataService {

    @Transactional
    public void addTestData(){
        // TODO
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我们在基于Spring的项目中所做的事情.

确保事务配置正确.如果要避免类/接口分离,请在元素中将proxy-target-class设置为true.