use*_*825 13 marshalling junit4 jaxb2
我在不使用XSD的情况下使用Jaxb 2.0 api,并使用注释创建了内容模型.我想为进行编组的类编写一个Junit测试.我最初的计划是将预期的XML String与用于断言的实际XML String进行比较(最明显的选择).但是我发现编组创建了xml,其中属性/属性顺序是不可预测的(实际上我不知道默认顺序是什么).现在,如果是这种情况,我不能假设一个预定义的xml字符串,然后将其与编组的字符串进行比较.我想要断言marshaller类的另一种方法如下:
1 - 创建内容模型.
2马歇尔吧.
3-Unmarshall在步骤2中创建的xml以获取模型.
4-Do断言基于第1步和第3步的模型,用于属性/属性.
但我仍然觉得这不令人满意.在这种情况下为编组编写Junit测试的正确方法是什么?
虽然使用编组的xml的实际应用程序不依赖于xml属性/属性顺序,但是Junit测试似乎很棘手.
谢谢
我在谷歌搜索同样的事情时偶然发现了你的问题.如果发现这篇文章,但不喜欢之后必须"解析"生成的XML的想法.在通过JAXB Javadoc筛选后,我找到了一种我非常喜欢的方法.JAXB Marshaller提供了一种以SAX ContentHandler作为参数的方法.您可以模拟它ContentHandler并验证是否已使用预期参数调用特定方法.
这是一个小例子.我编写了一个自定义Attributes匹配器,它只验证某些属性本地名称的存在,但不查看值(尚未).我希望你觉得这有用:
@Mock
private ContentHandler handler;
private JAXBContext context;
private ObjectFactory factory;
private Marshaller marshaller;
@Before
public void setUp() throws Exception
{
context = JAXBContext.newInstance(getClass().getPackage().getName());
factory = new ObjectFactory();
marshaller = context.createMarshaller();
}
@Test
public void test() throws Exception
{
final UpdateDescription description = new UpdateDescription("identifier", "version");
final JAXBElement<UpdateDescription> element = factory.createUpdateDescription(description);
marshaller.marshal(element, handler);
verify(handler).startDocument();
verify(handler).startElement(anyString(), eq("description"), anyString(), any(Attributes.class));
verify(handler).startElement(anyString(), eq("identifier"), anyString(), attrs("value"));
verify(handler).startElement(anyString(), eq("version"), anyString(), attrs("value"));
verify(handler).endDocument();
}
private static Attributes attrs(final String... localNames)
{
final Matcher<Attributes> matcher = new TypeSafeMatcher<Attributes>()
{
private Set<String> names = Sets.<String> newHashSet(localNames);
@Override
public void describeTo(final Description description)
{
// TODO Auto-generated method stub
}
@Override
public boolean matchesSafely(final Attributes item)
{
final Set<String> presentLocalNames = Sets.newHashSetWithExpectedSize(item.getLength());
final int length = item.getLength();
for (int i = 0; i < length; ++i) {
presentLocalNames.add(item.getLocalName(i));
}
return Sets.difference(names, presentLocalNames).isEmpty();
}
};
return new ThreadSafeMockingProgress().getArgumentMatcherStorage().reportMatcher(matcher).returnFor(
new AttributesImpl());
}
Run Code Online (Sandbox Code Playgroud)
对于那些更喜欢简单测试的人,这是我从RobertB的答案中链接的帖子中得到的内容,以及这里的答案:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
public class JaxbTestHelper {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static Object jaxbMarshalUnmarshal(Object schemaObject) throws Exception {
JAXBContext context = JAXBContext.newInstance(schemaObject.getClass());
Marshaller marshaller = context.createMarshaller();
Unmarshaller unmarshaller = context.createUnmarshaller();
ByteArrayOutputStream output = new ByteArrayOutputStream();
Object unmarshalledObject = null;
try {
marshaller.marshal(schemaObject, output);
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
unmarshalledObject = unmarshaller.unmarshal(input);
} catch (JAXBException e) {
// object class not annotated with @XmlRootElement, so we have to "wrap" and "unwrap" the object
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement(new QName("uri", "local"), schemaObject.getClass(), schemaObject),
output);
StreamSource source = new StreamSource(new ByteArrayInputStream(output.toByteArray()));
unmarshalledObject = unmarshaller.unmarshal(source, schemaObject.getClass()).getValue();
}
// callers should verify this returned object equals the schema object passed in
// ie, mySchemaObject.equals(jaxbMarshalUnmarshal(mySchemaObject))
return unmarshalledObject;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21373 次 |
| 最近记录: |