【问题标题】:Java Mockito - Unable to throw IOException during DocumentBuilder.parseJava Mockito - 在 DocumentBuilder.parse 期间无法抛出 IOException
【发布时间】:2019-07-11 10:54:49
【问题描述】:

我正在尝试创建一个 JUnit 测试以在 DocumentBuilder.parse(InputSource.class) 期间触发 IOException。

我不确定为什么我的“doThrow”方法没有触发 IOException。

源代码如下: JUnit 类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:META-INF/spring/test.xml" })
@Transactional
public class junitTestClass {

    @InjectMocks
    TargetClass target;

    @Rule
    public MockitoRule mockito = MockitoJUnit.rule();

    @Mock
    DocumentBuilder documentBuilder;

    @Mock
    DocumentBuilderFactory documentBuilderFactory;

    @Mock
    XPath xpath;

    @Test
    public void test01() throws InterruptedException, SAXException, IOException, ParserConfigurationException{

        when(documentBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilder);
        doThrow(new IOException()).when(documentBuilder).parse(any(InputSource.class));

        String xml = "<?xml version="1.0" encoding="UTF-8"?><aaa><bbb>123</bbb></aaa>";
        String pattern = "//aaa/bbb";

        try {
            target.parseXML(xml, pattern);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

主类:

private String parseXML(String xml, String pattern) {
        String itemValue ;

        try {
            DocumentBuilderFactory dFac = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dFac.newDocumentBuilder();
            Document document = db.parse(new InputSource(new StringReader(xml)));
            XPath xPath = XPathFactory.newInstance().newXPath();
            Node msgId = (Node) xPath.compile(pattern).evaluate(document, XPathConstants.NODE);
            itemValue = msgId.getTextContent();
        } catch (XPathExpressionException | SAXException | ParserConfigurationException | IOException e) {
            e.printStackTrace();
        }
        return itemValue;
    }

【问题讨论】:

  • 因为你在模拟错误。您实际上在DocumentBuilder db = dFac.newDocumentBuilder(); 中创建了一个新实例,因为您使用了DocumentBuilderFactory dFac = DocumentBuilderFactory.newInstance();
  • 因此,您需要模拟该静态工厂方法(如果可能),或者将其配置为返回模拟的构建器(如果可能)或将 DocumentBuilderFactory 注入您的代码中(以便您可以传递您制作的模拟)。
  • Thnx michalk 和 Thilo。目前,我只能更改 JUnit 类。在这种情况下,我如何模拟该静态工厂方法?
  • 您必须为此使用 PowerMock,除非您想让您的设计更具可测试性——例如使用依赖注入。
  • Mockito 不支持模拟静态方法。如果你想继续使用static,你应该转移到另一个模拟框架,如 PowerMock。另一方面,如果您可以通过构造函数、设置器等更改类以允许依赖注入,那么您的代码将变得更加可测试恕我直言

标签: java junit mockito


【解决方案1】:

你应该使用:

doThrow(IOException.class)

而不是实例化它。

【讨论】:

  • 仔细查看他的代码。这不是问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多