【问题标题】:Creating test data in database for tests在数据库中创建测试数据以进行测试
【发布时间】:2013-03-07 13:34:14
【问题描述】:

我想为我的项目(spring+hibernate)编写测试,而对于测试,我使用内存数据库(hsqldb)。我需要用一些数据填充我的数据库。至于我,最好的方法是使用 @BeforeClass 方法。像这样的

@Transactional
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:test-applicationContext.xml")
public class UsersControllerTest {

    @Autowired
    private static SessionFactory sessionFactory;

    @BeforeClass
    public static void setUpBeforeClass() {
            User u = new User();
            u.setLogin("test_login");
            u.setPassword("test_password");
            u.setName("test_name");

            Session session = sessionFactory.getCurrentSession();
            session.save(u);
    }

但我不能这样做,因为在这种情况下 sessionFactory 将为空。如果我使用@Before 方法而不是@BeforeClass,它将起作用。但我认为这不是一个好的解决方案,因为这个方法会在每个 @Test 方法之前运行,我不需要它。 所以我的问题很简单。当您需要在数据库中创建测试数据时,哪种解决方案最适合这种情况?

【问题讨论】:

    标签: spring hibernate junit


    【解决方案1】:

    如果简单地使用一个静态布尔标志来防止@Before 方法中的代码被重复执行呢?像这样的:

    public class UsersControllerTest {
    
        private static boolean isDataSetLoaded = false;
    
        @Autowired
        private SessionFactory sessionFactory;
    
        @Before
        public void setUp() throws Exception {
            if (!isDataSetLoaded) {
                loadDataset();
                isDataSetLoaded = true;
            }
        }
    
        private void loadDataset() throws Exception {
            // save various entities here
        }
    }
    

    更新:

    我想提请您注意上述解决方案的一个警告,它只是让我非常头疼:

    @Transactional 支持由 Spring 以一种非常违反直觉的方式实现。我希望事务在进入测试方法之前打开,但实际上它们已经在更早的阶段打开了:甚至在 @Before 注释方法执行之前。

    这意味着loadDataset() 中的任何数据操作都将在与第一个测试方法相同的事务中运行,这是一个巨大 问题,因为@Transactional 测试方法的默认行为是最后回滚。最终结果是loadDataset() 中的所有初始化步骤在第一个测试方法之后都被撤消,因此如果它们依赖于准备好的数据,后续测试方法将失败。

    当然,如果loadDataset() 中的操作愿意加入现有事务,这只是一个问题,这可以通过应用适当的事务属性来防止(例如,使用TransactionTemplatePropagation.REQUIRES_NEW)。

    【讨论】:

    • 因为没有其他建议,我会使用你的。谢谢!
    • 刚刚更新了我的回答,请在上面查看,以免出现意外问题。
    猜你喜欢
    • 2018-03-25
    • 2015-12-15
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2020-11-17
    • 2023-01-28
    相关资源
    最近更新 更多