多个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

    上一篇: Path to XML DTD for DBUnit in multi

    下一篇: DTD download error while parsing XHTML document in XOM