Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Java JUnit测试之间相同的hibernate会话导致问题_Java_Spring_Hibernate_Junit4_Dbunit - Fatal编程技术网

Java JUnit测试之间相同的hibernate会话导致问题

Java JUnit测试之间相同的hibernate会话导致问题,java,spring,hibernate,junit4,dbunit,Java,Spring,Hibernate,Junit4,Dbunit,我正在开发一个基于Spring2.5和Hibernate3的web应用程序。最近,我引入了JUnit测试,并使用DBUnit框架进行了一些集成测试。DBUnit应该在一个测试和另一个测试之间使用xml数据集更新数据库,正如我所看到的,它工作得很好 然而,当我在一个测试中更新一个元素时,hibernate似乎捕捉到了这个信息,即使我在下面的测试中加载了这个元素,这个信息也是我修改过的。如果我在暂停执行时查看数据库,数据库将由DBUnit正确重置。所以我认为这可能是一个休眠问题 有没有一种方法可以在

我正在开发一个基于Spring2.5和Hibernate3的web应用程序。最近,我引入了JUnit测试,并使用DBUnit框架进行了一些集成测试。DBUnit应该在一个测试和另一个测试之间使用xml数据集更新数据库,正如我所看到的,它工作得很好

然而,当我在一个测试中更新一个元素时,hibernate似乎捕捉到了这个信息,即使我在下面的测试中加载了这个元素,这个信息也是我修改过的。如果我在暂停执行时查看数据库,数据库将由DBUnit正确重置。所以我认为这可能是一个休眠问题

有没有一种方法可以在测试之间拆开,说我想为我的spring上下文创建一个新的hibernate会话?顺便说一下,我没有使用Spring注释,而是通过代码获得Spring上下文:

String[] contextLocations = new String[2];
contextLocations[0] = "WebContent/WEB-INF/applicationContext.xml";
contextLocations[1] = "src/System_V3/test/applicationContext.xml";
context = new FileSystemXmlApplicationContext(contextLocations);
数据库单元设置:

@Before
public void setUpBeforeClass() throws Exception {
    handleSetUpOperation();
}

private static void handleSetUpOperation() throws Exception {
    conn = getConnection();
    conn.getConnection().setAutoCommit(false);
    final IDataSet data = getDataSet();
    try {
        DatabaseOperation.REFRESH.execute(conn, data);
    } finally {
        conn.close();
    }
}

private static IDatabaseConnection getConnection() throws ClassNotFoundException, SQLException,
        DatabaseUnitException {
    Class.forName("org.gjt.mm.mysql.Driver");
    return new DatabaseConnection(DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/web_database", "root", "pass"));
}

private static IDataSet getDataSet() throws IOException, DataSetException {
    ClassLoader classLoader = TestPrueba.class.getClassLoader();
    return new FlatXmlDataSetBuilder().build(classLoader
            .getResourceAsStream("System_V3/test/dataset.xml"));
}
测试在JUnit4中仅使用@Test注释完成,测试类不扩展任何库类


有什么建议吗?

您需要在事务中执行测试。这可以通过为您的测试设置。配置好后,您可以在每个测试中使用
@Transactional
注释

通过这种方法,您也可以将bean直接连接到测试中

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-file.xml" })
public class MyTest {

    @Autowired
    private MyService myService;

    @Transactional
    @Test
    private void myFirstTest() {
        ...
        myService.executeSomething();
        ...
    }

}

当然,您可以将默认行为设置为在测试类上回滚,并使用
@TransactionConfiguration(defaultRollback=true/false)对其进行注释。

您需要在事务中执行测试。这可以通过为您的测试设置。配置好后,您可以在每个测试中使用
@Transactional
注释

通过这种方法,您也可以将bean直接连接到测试中

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-file.xml" })
public class MyTest {

    @Autowired
    private MyService myService;

    @Transactional
    @Test
    private void myFirstTest() {
        ...
        myService.executeSomething();
        ...
    }

}

当然,您可以将默认行为设置为在测试类上回滚,并使用
@TransactionConfiguration(defaultRollback=true/false)

对其进行注释-不确定这是否对您有帮助-但以防万一

尝试使用session.clear()并在teardown方法中使用它。 请看这里()

根据规范会话。清除()->
完全清除会话。逐出所有加载的实例并取消所有挂起的保存、更新和删除。不要关闭打开的迭代器或ScrollableResults实例。

不确定这是否对您有帮助-但以防万一

尝试使用session.clear()并在teardown方法中使用它。 请看这里()

根据规范会话。清除()->
完全清除会话。逐出所有加载的实例并取消所有挂起的保存、更新和删除。不要关闭打开的迭代器或ScrollableResults实例。

当您使用
@Before
注释setupBeforeClass方法时:您知道
@BeforeClass
@BeforeClass
JUnit4注释之间的区别吗?@Korgen,此setupBeforeClass()方法调用DBUnit,以便在执行每个测试之前将数据集数据插入数据库。是的,我希望这样。当您使用
@Before
注释setupBeforeClass方法时:您是否知道
@Before
@BeforeClass
JUnit4注释之间的区别?@Korgen,此setupBeforeClass()方法在执行每个测试之前调用DBUnit将数据集数据插入数据库。是的,我想这样。