Java 冬眠:有可能吗;“保存级联”;只在测试中?

Java 冬眠:有可能吗;“保存级联”;只在测试中?,java,spring,hibernate,Java,Spring,Hibernate,我想知道是否可以保存我的实体,但只能在我运行测试时保存 我希望能够保存cascade,但只有在运行测试时才能保存。为了测试我的dao,如果我可以只保存一个实体而不会因为子实体还没有保存而出错,这将节省我很多时间 @Test public void addGetEntityTests(){ Entity entity1 = ...; Entity entity2 = ...; //same as entity1 getDao().addEntity(entity1);

我想知道是否可以保存我的实体,但只能在我运行测试时保存

我希望能够保存cascade,但只有在运行测试时才能保存。为了测试我的dao,如果我可以只保存一个实体而不会因为子实体还没有保存而出错,这将节省我很多时间

@Test
public void addGetEntityTests(){

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

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

谢谢。

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


编辑:带有DBunit的示例

您在注释中解释说,设置对象中的所有数据是乏味的。因此,我假设您需要设置多个行和关系来创建上下文。 在这种情况下,您可以使用DBunit并分两步进行:

  • 在数据集中写每一行也会很乏味。另一种方法是根据现有数据库上的查询动态创建数据集,该数据库包含要检索的数据
    此步骤将播放一次,以创建要在单元测试中使用的数据集
  • 在测试开始之前使用生成的数据集
我使用了一些我稍微修改过的例子

第一步(生成数据集):

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


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


编辑:带有DBunit的示例

您在注释中解释说,设置对象中的所有数据是乏味的。因此,我假设您需要设置多个行和关系来创建上下文。 在这种情况下,您可以使用DBunit并分两步进行:

  • 在数据集中写每一行也会很乏味。另一种方法是根据现有数据库上的查询动态创建数据集,该数据库包含要检索的数据
    此步骤将播放一次,以创建要在单元测试中使用的数据集
  • 在测试开始之前使用生成的数据集
我使用了一些我稍微修改过的例子

第一步(生成数据集):

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


是的,但在应用程序中,我只想测试“add”方法。在我的应用程序中,如果子对象不存在,则出现错误是正常的。我已经在before方法中添加了子对象,但这真的很麻烦……如果这样麻烦,那么在调用测试方法之前,应该在DBunit数据集中提取所需的数据并注入此数据集。如果要获取许多行,甚至可以使用DBunit帮助器类来初始化它们。我刚刚编辑了我的答案,用官方文档展示了一个简单的例子。是的,但在应用程序中我只想测试“add”方法。在我的应用程序中,如果子对象不存在,则出现错误是正常的。我已经在before方法中添加了子对象,但这真的很麻烦……如果这样麻烦,那么在调用测试方法之前,应该在DBunit数据集中提取所需的数据并注入此数据集。如果要获取许多行,甚至可以使用DBunit帮助器类来初始化它们。我刚刚编辑了我的答案,用官方文件展示了一个简单的例子。
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"));                      
    }
}
<!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);
  }
}