我正在开发一个基于Spring 2.5和hibernate 3的Web应用程序。最近我介绍了JUnit测试,并且我已经使用DBUnit框架完成了一些集成测试。 DBUnit应该在一个测试和另一个测试之间用xml数据集更新数据库,并且它运行良好,正如我所见。
然而,当我更新测试中的元素时,hibernate似乎捕获了这些信息,甚至我在下面的测试中加载了元素,信息是我修改过的。如果在执行暂停时查看数据库,则DBUnit会正确重置数据库。所以我认为它可能是一个Hibernate问题..
有没有办法在测试之间做一个tearDown,说我想要一个新的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);
DBUnit setUp:
@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"));
}
仅使用@Test注释在JUnit 4中完成测试,测试类不扩展任何库类。
有什么建议吗?
答案 0 :(得分:3)
不确定这是否可以帮助您 - 但以防万一...
尝试使用session.clear()并在拆解方法中使用它。 请看这里http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#clear()
根据规范session.clear() - > 完全清除会话。退出所有已加载的实例并取消所有挂起的保存,更新和删除。不要关闭打开的迭代器或ScrollableResults的实例。
答案 1 :(得分:1)
您需要在事务中执行测试。这可以通过为您的测试设置SpringJUnit4ClassRunner来实现。配置完成后,您可以在每次测试时使用@Transactional
注释。
通过这种方法,您可以直接@Autowired
您的bean进行测试。
例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-file.xml" })
public class MyTest {
@Autowired
private MyService myService;
@Transactional
@Test
private void myFirstTest() {
...
myService.executeSomething();
...
}
}
当然,您可以在测试类上将默认行为设置为RollBack,并使用@TransactionConfiguration(defaultRollback = true/false)