Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to force a JAXBException when marshalling for a JUnit test

Tags:

jaxb

I haven't been able to find a way to force a JAXBException when marshalling for a JUnit test. Does anyone have any ideas?

Here is my marshalling code:

   public String toXml() {
          log.debug("Entered toXml method");
    String result = null;
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Config.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter writer = new StringWriter();
        jaxbMarshaller.marshal(this, writer);
        result = writer.toString();
    } catch (JAXBException e) {
          log.error(e);
    }
          log.debug("Exiting toXml method");
    return result;
   }
like image 515
Maria Cristina Siena Avatar asked Nov 14 '12 23:11

Maria Cristina Siena


People also ask

How do you trigger JAXBException?

You can generate a JAXBException during a marshal operation by marshalling an instance of a class that the JAXBContext isn't aware of (i.e. Take your example and use it to marshal an instance of Foo ). This will produce the following exception.

What is JAXBException?

Packages that use JAXBException. Package. Description. javax.xml.bind. Provides a runtime binding framework for client applications including unmarshalling, marshalling, and validation capabilities.


1 Answers

There are different ways to create a JAXBException during a marshal operation:

1 - Marshal an Invalid Object

You can generate a JAXBException during a marshal operation by marshalling an instance of a class that the JAXBContext isn't aware of (i.e. Take your example and use it to marshal an instance of Foo). This will produce the following exception.

Exception in thread "main" javax.xml.bind.JAXBException: class forum13389277.Foo nor any of its super class is known to this context.
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:594)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:482)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)
    at forum13272288.Demo.main(Demo.java:27)

2 - Marshal to Invalid Output

If you try to marshal to an invalid output such as an OutputStream that has been closed:

    FileOutputStream closedStream = new FileOutputStream("src/foo.xml");
    closedStream.close();
    jaxbMarshaller.marshal(this, closedStream);

Then you will get a MarshalException which is a subclass of JAXBException.

Exception in thread "main" javax.xml.bind.MarshalException
 - with linked exception:
[java.io.IOException: Stream Closed]
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:320)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)
    at forum13272288.Demo.main(Demo.java:27)
Caused by: java.io.IOException: Stream Closed
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:318)
    at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.flushBuffer(UTF8XmlOutput.java:413)
    at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.endDocument(UTF8XmlOutput.java:137)
    at com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput.endDocument(IndentingUTF8XmlOutput.java:165)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.endDocument(XMLSerializer.java:852)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.postwrite(MarshallerImpl.java:369)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:316)
    ... 3 more
like image 117
bdoughan Avatar answered Oct 27 '22 16:10

bdoughan