我在ANT中运行Junit测试时的错误。测试类需要致电Web服务API。
有人可以帮助解决吗?
<error message="javax.xml.transform.TransformerFactory.setFeature(Ljava/lang/String;Z)V" type="java.lang.AbstractMethodError">java.lang.AbstractMethodError: javax.xml.transform.TransformerFactory.setFeature(Ljava/lang/String;Z)V
at com.sun.xml.ws.util.xml.XmlUtil.newTransformerFactory(XmlUtil.java:392)
at com.sun.xml.ws.util.xml.XmlUtil.newTransformerFactory(XmlUtil.java:400)
at com.sun.xml.ws.util.xml.XmlUtil.<clinit>(XmlUtil.java:233)
at com.sun.xml.ws.client.WSServiceDelegate.createCatalogResolver(WSServiceDelegate.java:377)
at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:363)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:321)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:211)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:207)
at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:114)
at javax.xml.ws.Service.<init>(Service.java:77)
at com.citi.isg.amg.ws.client.AccountManagerWs.<init>(AccountManagerWs.java:42)
at ... ...
我刚刚自己找到了根本原因。
每个Oracle文档,当应用程序试图调用抽象方法时,java.lang.abstractmethoderror被抛出。通常,此错误被编译器捕获。仅当某些类的定义已更改时,此错误才能在运行时间发生,因为当前执行方法上次是汇编的。
似乎我尚未指定rt.jar中的抽象类Javax.xml.transform.transformerfactory的实现。
在下面添加junit
<sysproperty key="javax.xml.transform.TransformerFactory"
value="com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>
使其有效。
因此,最终的Junit任务看起来如下:
<junit showoutput="true" printsummary="yes" fork="true" forkmode="once">
<classpath refid="junit.runtime.classpath" />
<sysproperty key="javax.xml.transform.TransformerFactory"
value="com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>
<batchtest haltonfailure="no" todir="${test.result.dir}">
<fileset dir="${test.src.dir}">
<include name="**/*Test.java" />
</fileset>
<formatter type="xml" />
</batchtest>
</junit>
专门针对TransformerFactory.setFeature
的替代说明:看来某些实现(例如Xalan-2.6.0(提供了不实现该方法的TransferalerFactory实现;Xalan的较新版本(例如2.7.3(确实提供了该方法,AbstractMethoderror消失了。