Hibernate:是否可以"保存级联"只在测试?

时间:2016-11-30 09:03:41

标签: java spring hibernate

我想知道是否可以保存级联我的实体但仅在我运行测试时?

我希望能够保存级联,但只有在我运行测试时才能保存。为了测试我的dao,如果我可以保存级联实体而不会出现错误,因为子实体尚未保存,这将节省我很多时间。

@Test
public void addGetEntityTests(){

    Entity entity1 = ...;
    Entity entity2 = ...; //same as entity1

    getDao().addEntity(entity1);
    assertEquals(entity1, entity2);

谢谢。

1 个答案:

答案 0 :(得分:3)

如果不修改实体声明或正在测试的查询,则无法执行您想要实现的目标 并且你不应该这样做,因为在这种情况下,你的测试没有执行与你的实现相同的逻辑,而测试应该检查实现是否按预期工作。
如果您需要在测试开始时获得上下文,则应在课程的@Before方法之前创建此上下文。
您可以通过自己的服务(如果已测试)或使用DBunit等工具的SQL注入数据库中的数据。

编辑:使用DBunit的示例

您在评论中解释说,设置对象中的所有数据非常繁琐。所以,我想你有多个行和关系来设置创建你的上下文。 在这种情况下,您可以使用DBunit并分两步进行:

  • 在数据集中写下每一行也很乏味。另一种方法是从包含要检索的数据的现有数据库中的查询动态创建数据集。
    此步骤将播放一次,以创建要在单元测试中使用的数据集。
  • 在测试开始之前使用此生成的数据集

我使用了http://dbunit.sourceforge.net/howto.html中我稍微适应的例子。

第一步(生成数据集):

public class DatabaseExportSample
{
    public static void main(String[] args) throws Exception {
        // database connection
        Class driverClass = Class.forName("org.hsqldb.jdbcDriver");
        Connection jdbcConnection = DriverManager.getConnection(
                "jdbc:hsqldb:sample", "sa", "");
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);

        // partial database export
        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("FOO", "SELECT * FROM TABLE WHERE COL='VALUE'");
        partialDataSet.addTable("BAR");
        FlatXmlDataSet.write(partialDataSet, new FileOutputStream("partial.xml"));

        // full database export
        IDataSet fullDataSet = connection.createDataSet();
        FlatXmlDataSet.write(fullDataSet, new FileOutputStream("full.xml"));

        // dependent tables database export: export table X and all tables that
        // have a PK which is a FK on X, in the right order for insertion
        String[] depTableNames = 
          TablesDependencyHelper.getAllDependentTables( connection, "X" );
        IDataSet depDataset = connection.createDataSet( depTableNames );
        FlatXmlDataSet.write(depDataSet, new FileOutputStream("dataset.xml"));                      
    }
}

它将生成一个xml文件(这是一个示例):

<!DOCTYPE dataset SYSTEM "dataset.dtd">
<dataset>
    <table name="TEST_TABLE">
        <column>COL0</column>
        <column>COL1</column>
        <column>COL2</column>
        <row>
            <value>row 0 col 0</value>
            <value>row 0 col 1</value>
            <value>row 0 col 2</value>
        </row>
        <row>
            <null/>
            <value>row 1 col 1</value>
            <null/>
        </row>
    </table>
    <table name="SECOND_TABLE">
        <column>COLUMN0</column>
        <column>COLUMN1</column>
        <row>
            <value>row 0 col 0</value>
            <value>row 0 col 1</value>
        </row>
    </table>
    <table name='EMPTY_TABLE'>
        <column>COLUMN0</column>
        <column>COLUMN1</column>
    </table>
</dataset>

第二步(在测试数据库中注入此数据集):

public class SampleTest {

  @Before
  protected void setUp() throws Exception
  {
    super.setUp();

    // initialize your database connection here
    IDatabaseConnection connection = null;
    // ...

    // initialize your dataset here
    IDataSet dataSet = null;
    // ...

    try1
    {
        DatabaseOperation.CLEAN_INSERT.execute(connection, "dataset.xml");
    }
    finally
    {
        connection.close();
    }
  }
  ...
  // when your test method starts you have the required data in your test database
  @Test
  public void addGetEntityTests(){
    Entity entity1 = ...;
    getDao().addEntity(entity1);
  }
}