spring – junit 4 TransactionalTestExecutionListener只为类中的所有测试插入测试数据一次?

我有一个测试DAO的junit 4测试类.

单元测试:

  @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {
      "classpath:/WEB-INF/applicationContext-db.xml",
      "classpath:/WEB-INF/applicationContext-hibernate.xml",
      "classpath:/WEB-INF/applicationContext.xml" })
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class})
    @DataSetLocation("test/java/com/yada/yada/dao/dbunit-general.xml")
    @TransactionConfiguration(transactionManager="transactionManager", defaultRollback = true)
    @Transactional
    public class RealmDAOJU4Test {

     @Autowired
     private DbUnitInitializer dbUnitInitializer;

     @Autowired
     private RealmDAO realmDAO;

     @BeforeTransaction
     public void setupDatabase() {
       // use dbUnitInitializer to insert test data
     }

     @Test
     public void testGetById() {
      Integer id = 2204;
      Realm realm = realmDAO.get(id);
      assertEquals(realm.getName().compareToIgnoreCase(
        "South Technical Realm"), 0);
      assertEquals(8, realm.getRealmRelationships().size());
     }

     // more test methods annotated here
}

@BeforeTransacation方法在每个测试方法之前运行.我想做的是:使用我的DbUnitInitializer将数据加载到我的数据库中 – 在创建类时ONCE.然后让类中的每个测试执行它需要对数据库执行的操作,然后回滚(不提交)它的更改.在每次测试之前重新插入测试文件中的所有相同数据似乎过度杀戮.有没有办法实现这个目标?

要么

在每次测试之前,编写这些测试以完全加载数据库的正确方法是什么?如果是这样,defaultRollback = true在这种情况下有什么功能?

谢谢你帮我一起思考……

最佳答案 您需要使用TestExecutionListener并在beforeTestClass方法中设置数据库.请参阅Spring用户指南中的
Annotations section of the Testing chapter.

点赞