在DBUnit中使用脚本来生成测试数据
在DBUnit中使用脚本来生成测试数据
用过rails 的人都会觉得rails的测试中,fixtures 实在是一个非常方便的工具。在Java中,我们通常会使用dbunit 来维护我们的测试数据,但是,dbunit有一个不方便的地方,就是测试数据要手写。虽然我们也可以从数据库中导出来,但这并不是万灵药。
在Rails中,我们可以在fixtures中写ruby 代码,这称为动态fixtures。在dbunit 中如果也能这么做就好了!
首先,如果要实现这个功能,那么肯定涉及动态脚本的内容。自己写一个?太费劲了,浪费时间,最主要是没这个能力:)。
那么怎么办?当然是“站在巨人的肩膀上”了!目前java所支持的动态脚本很多,不过我还是选择了一个大家都熟悉的脚本:javascript。没别的原因,就是因为它简单,而且大家都熟悉。
好了,那么我们有了一个大致的思路,就是用一个工具,去读javascript脚本,这个javascript当然负责动态生成 dbunit所需要的xml信息,然后dbunit再根据这些动态生成的xml信息,去维护数据库的信息。
Java 解析javascript的内容,大家可以去看看 http://www.iteye.com/topic/87423 。这里所介绍的rhino功能强大,但是我们没必要用那么多,只要能执行函数就行了。
多说无益,下面介绍一下步骤。
首先写一个javascript,用于生成dbunit 所需的xml信息:
function create_dataset_xml_msg() {var dataset_xml_msg;dataset_xml_msg = '<dataset>\n';for(var record_count = 0; record_count <10; record_count++) {dataset_xml_msg += '<test1 user_name="user_'+record_count+'"/>\n';}dataset_xml_msg += '</dataset>\n';return dataset_xml_msg;}create_dataset_xml_msg();
public static InputStream LoadDataSetStr() throws Exception{Context cx = Context.enter();cx.setLanguageVersion(Context.VERSION_1_2);Scriptable scope = cx.initStandardObjects();File file = new File("dataset.js");LineNumberReader ln = new LineNumberReader(new FileReader(file));String js = "";String s;while((s = ln.readLine())!=null) {js += s+"\n";}Object result = cx.evaluateString(scope, js,null, 1, null);String jsResult = cx.toString(result);ByteArrayInputStream ba = new ByteArrayInputStream(jsResult.getBytes());return ba;}