【发布时间】: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。另一方面,如果您可以通过构造函数、设置器等更改类以允许依赖注入,那么您的代码将变得更加可测试恕我直言