多个DBUnit的XML DTD路径
我有一个多模块maven项目。 在persist模块中,我有许多引用DTD的XML文件数据文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "myapp-data.dtd" >
<dataset>
.....omitted for brevity....
</dataset>
DTD与XML文件存储在同一个目录中,甚至Eclipse也会将这些XML文件报告为有效。
但是,当我运行该应用程序时,DBUnit FlatXMLDataSet将引发FileNotFound异常,因为它无法找到DTD。 显然,在根项目目录(例如myproject /)中寻找DTD。 我希望它能够在XML文件本身的同一目录中查找DTD(例如myproject / persist / target / test-data)。
看着DBUnit源代码,它有这样的说法:“相对DOCTYPE uri从当前工作的dicrectory解析。”
什么是解决这个问题的好方法?
好的,我想我已经明白了这一点。 谢天谢地,开源。
FlatXmlDataSetBuilder上有一个将流传送给DTD的方法。 这真是疯了,这是一个公共方法IMO,但是再一次,它的疯狂之处在于DBUnit不会像dtd文件的XML那样查看相同的目录。 所以这里是:
String dtdResourceName = "classpath:test-data/myapp-data.dtd";
Resource res = applicationContext.getResource(dtdResourceName);
builder.setMetaDataSetFromDtd(res.getInputStream());
现在,我将DOCTYPE声明与dtd放在与XML相同的目录中,并使用这种黑客来欺骗DBUnit做正确的事情。
总是使用正确的变量来访问特殊的目录,因为多模块构建具有与本地构建不同的工作目录:
所以
mydir
使用${project.basedir}/mydir
target/mydir
使用${project.build.directory}/mydir
target/classes/mydir
使用${project.build.outputDirectory}/mydir
无论这些变量从何处被调用,这些变量都会对当前项目进行评估。 这里是POM变量的概述(不完整,但最重要的东西在那里)
另外,如果您想要进行一些交互式的查询式调试,help:evaluate mojo会派上用场:
只是打电话
mvn help:evaluate
并且会提示您输入表达式。 如果你输入一个表达式,比如${project.build.plugins[0]}
,那么指定元素的合并dom将被列出
编辑:
好吧,现在我想我看到了问题。 那为什么不直接引用xml中的目录呢:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "target/test-classes/myapp-data.dtd" >
我知道这不是很好,但它应该工作,多模块或不。 单元测试的当前目录始终是当前的$ {project.basedir},而不是父项目dir。
您可以将DTD发布到Web服务器,然后将其HTTP URL放入DOCTYPE中,例如:
<!DOCTYPE myapp-data SYSTEM "-//The Owner//The Description//EN" "http://host/path/to/myapp-data.dtd">
链接地址: http://www.djcxy.com/p/34895.html