JAXB抱怨名称空间应该存在时却存在

JAXB抱怨名称空间应该存在时却存在,jaxb,mockito,powermockito,Jaxb,Mockito,Powermockito,我有一组单元测试,将存储的XML文件解组到JAXB对象中。他们在工作。这些测试使用PowerMock(1.6.6),因为CUT(测试中的代码)中有一个细节需要“whenNew”条款 我决定在对象工厂的后面对其进行抽象,这使我能够转移到纯Mockito 当我这样做时,在测试期间,当将XML文件解组到JAXB对象中时,我开始遇到难以解释的问题。它只是没有将某些元素存储到JAXB对象中 进行解组的方法如下所示: protected JAXBElement<?> unmarshallToOb

我有一组单元测试,将存储的XML文件解组到JAXB对象中。他们在工作。这些测试使用PowerMock(1.6.6),因为CUT(测试中的代码)中有一个细节需要“whenNew”条款

我决定在对象工厂的后面对其进行抽象,这使我能够转移到纯Mockito

当我这样做时,在测试期间,当将XML文件解组到JAXB对象中时,我开始遇到难以解释的问题。它只是没有将某些元素存储到JAXB对象中

进行解组的方法如下所示:

protected JAXBElement<?> unmarshallToObject(Node node, Class<?> nodeClassType) throws ServiceException {
    try {
        return getUnmarshaller().unmarshal(node, nodeClassType);
    } catch (JAXBException ex) {
        baseLogger.error(null, ex, "JAXB Exception while un-marshalling");
        throw new ServiceException(UslErrCodes.BACKEND_APP.createServiceErr(BackendConfig.USL.getId(),
                "JAXB Exception while un-marshalling"), ex);
    }
}
下面是来自同一个包生成的“包信息”的@XmlSchema注释:

@XmlSchema(namespace="http://namespace1.xsd", elementFormDefault=XmlNsForm.QUALIFIED)
所以,在得到这个错误后,我决定尝试做一个“这不可能工作”的改变

我更改了XML文件,这是类似的摘录:

    <ExecuteFooResponse xmlns:ns1="http://namespace1.xsd" xmlns:ns2="http://namespace2.xsd">
        <FooResult>
            <securityFeeRequired>false</securityFeeRequired>
            <Treatment><code>A001</code>
                <message>No additional fee is required at this time</message>
            </Treatment>
            <ServiceEligibility>
                <productCode>BAR</productCode>
                <serviceEligibilityIndicator>true</serviceEligibilityIndicator>
            </ServiceEligibility>
        </FooResult>
        <Response>
            <ns2:code>0</ns2:code>
            <ns2:description>Success</ns2:description>
        </Response>
    </ExecuteFooResponse>
我所做的唯一更改是“namespace1.xsd”的名称空间前缀。在我看来,这是正确的。我把它改为“ns1”,但只是在声明中。我显然没有在元素体中引用该前缀。这使得测试通过


请恢复我的理智。

问题在于测试使用的XML文档实际上不是有效的模式。他们有一些微妙的问题导致验证失败,但是其他开发人员故意将这些问题放在那里,因为他们发现如果没有这些错误,PowerMock测试将无法通过。我仍在试图弄清楚为什么PowerMock只能处理处于这种状态的文件,但我的文档现在是模式有效的,Mockito测试也在工作

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "creditScoreResult", "creditScoreMessage", "warningMessage",
        "securityFeeRequired", "treatment", "creditBand", "proprietarySegmentFlag", "serviceEligibility" })
public static class FooResult implements Serializable {
    private static final long serialVersionUID = 1L;
    protected String creditScoreResult;
    protected String creditScoreMessage;
    protected String warningMessage;
    protected boolean securityFeeRequired;
@XmlSchema(namespace="http://namespace1.xsd", elementFormDefault=XmlNsForm.QUALIFIED)
    <ExecuteFooResponse xmlns:ns1="http://namespace1.xsd" xmlns:ns2="http://namespace2.xsd">
        <FooResult>
            <securityFeeRequired>false</securityFeeRequired>
            <Treatment><code>A001</code>
                <message>No additional fee is required at this time</message>
            </Treatment>
            <ServiceEligibility>
                <productCode>BAR</productCode>
                <serviceEligibilityIndicator>true</serviceEligibilityIndicator>
            </ServiceEligibility>
        </FooResult>
        <Response>
            <ns2:code>0</ns2:code>
            <ns2:description>Success</ns2:description>
        </Response>
    </ExecuteFooResponse>