Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行JUnit测试之前重置mysql数据库_Mysql_Hibernate_Spring_Junit - Fatal编程技术网

在运行JUnit测试之前重置mysql数据库

在运行JUnit测试之前重置mysql数据库,mysql,hibernate,spring,junit,Mysql,Hibernate,Spring,Junit,我有大约10个JUnit将自动执行。我想在每个数据库中重置数据库。我有一段代码: //@Transactional public class TestMediaObjectService extends AbstractDataAccessTest{ //This method reset the database, emptying the tables @Test public void testCreateDataBase() throws Exception {

我有大约10个JUnit将自动执行。我想在每个数据库中重置数据库。我有一段代码:

//@Transactional
public class TestMediaObjectService extends AbstractDataAccessTest{

//This method reset the database, emptying the tables
    @Test
    public void testCreateDataBase() throws Exception {
        TestDatabaseCreation creation = new TestDatabaseCreation();
        creation.resetDatabase();
    }

//This is one of the methods. 
    @Test
    public void testStoreMediaObject() throws Exception {
//......
}
当我使用在方法
testCreateDataBase
中使用的相同脚本手动重置数据库时,然后运行此测试(不使用该方法),表将自动创建。但如果按照上面粘贴的方式运行代码,则不会创建表,因此会出现以下错误:

原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'one_Table'不存在


在运行测试中的其他方法之前,如何在每个测试中运行该方法?注释
@Transactional
已删除,但错误仍然存在。

通常不需要手动重置数据库,因为JUNIT在每次测试之前都会为您执行此操作。使用以下注释:

@TransactionConfiguration(defaultRollback = true)
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
Junit将在运行测试后回滚测试中完成的所有事务。您只需要一个现有的空数据库。如果使用hibernate来管理实体,甚至不需要表

如果要手动执行此操作,请在设置方法中使用
@Before
注释:

@Before
public void init() {
    createTables();
}
这将在每次测试之前运行


如果要为类中的所有测试设置一次数据库表,请使用
@BeforeClass
。但通常这不是最佳做法,因为每个测试都应该独立于任何其他测试。

此配置不会重置数据库。它说测试将在db事务中执行,事务不会提交,而是回滚。所有事情都将发生在实体管理器缓存中或未提交的DB事务中。简单的单元测试应该以这种方式工作。更复杂的集成测试不会。我明白你的意思,尽管问题并不是关于是否确实需要提交数据。但是:无论如何,为什么要在单元测试中将数据提交到数据库中呢?我能想到的唯一原因是测试数据库连接或事务环境,或者是否有分布式环境。我认为,对现有数据的集成测试不应该在单元测试中进行,因为该测试不是独立的。它应该自己设置所有必需的数据。谢谢,但是数据库不会用这些注释重置。我得到了一个例外。我正在我的应用程序中做一些测试,我有一个数据库来解决这个问题。不是应用程序中要使用的数据库itself@BlancaHdez:“但是数据库没有用这些注释重置。我得到DuplicateObjectException”。”。。这是正确的,此注释不会重置数据库,而是阻止在测试中所做的更改被持久化(除非您在测试中打开了新事务)。因此,问题可能是您应该从一个空数据库开始。