首页 > 解决方案 > Junit 测试 JAXBContext 以抛出 JAXBException - 使用 mockito 测试失败场景

问题描述

我有一个测试 jaxbexception 的方法,在这个方法之前有初始验证,所以我不能发送无效请求来发生 JAXBException。我看到的唯一方法是使用 MOCKITO,尝试过但对我不起作用。

待测方法:

 private String methodtoBeTested(Object request, Class clazz)
{
    try
    {
        StringWriter sw = new StringWriter();
        JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.marshal(request, sw);
        return sw.toString();
    }
    catch(JAXBException e)
    {
        LOG.error("jaxbexception encountered" + e.getMessage());
    }
}

到目前为止,我尝试过:

JAXBContext jaxbMock = mock(JAXBContext.class);
    Marshaller marshalmock = mock(Marshaller.class);
    when(jaxbMock.createMarshaller()).thenThrow(JAXBException.class);

标签: javajunitmockito

解决方案


这里的问题JAXBContext jaxbContext = JAXBContext.newInstance(clazz);是调用一个静态方法JAXBContext,你不能Mockito用来模拟它。你可以使用PowerMockito,但也许这是矫枉过正。

您可以测试它是否为否定的一种方法是找到Class它不能与它一起使用的一个 - 例如,一个没有 JAXB 注释,或者是私有的,或者一个内部类,或者它自然不喜欢的其他东西。使用真正失败的输入调用此方法,将比模拟失败更好地测试您的错误处理,这可能无法真实反映现实生活中的失败。

或者,将这个特定的代码微模块放在接口后面,并模拟整个接口,以使您能够测试它的调用者如何处理它遇到错误。


推荐阅读