使用getClass()创建一个StreamSource.getClassLoader()。getResourceStream(

时间:2013-10-16 05:11:03

标签: junit mocking junit4 easymock powermock

我发布了这个问题并得到了一些解释,但我无法解决问题。现在,因为事件我有了更好的理解,我将再次以新的角度发布。

我的节点中有以下行。

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        /*
         * Associate the schema factory with the resource resolver, which is
         * responsible for resolving the imported XSD's
         */
        factory.setResourceResolver(new ResourceResolver());

        Source schemaFile = new StreamSource(getClass().getClassLoader().getResourceAsStream(schemaName));
        Schema schema = factory.newSchema(schemaFile);
        Validator validator = schema.newValidator();
        validator.validate(new DOMSource(document));

我想我有两个选择。要么模拟

Source schemaFile = new StreamSource(getClass().getClassLoader().getResourceAsStream(schemaName));

Schema schema = factory.newSchema(schemaFile);

我一直拉着头发做了第一天。我尝试如下

expectNew(StreamSource.class, InputStream.class).andReturn(mockSource);

expectNew(StreamSource.class, anyObject(InputStream.class)).andReturn(mockSource);

但没效果。

现在我正试图嘲笑第二行

Schema schema = factory.newSchema(schemaFile);

这个对我来说也不太清楚。我是否需要模拟像

这样的工厂
SchemaFactory mockFactory = EasyMock.createMock(SchemaFactory.class);

或者因为工厂是使用newInstance静态方法调用创建的,所以它是一种不同的方式吗?

感谢您对此问题的任何帮助。

稍后添加

我对这种情况有所了解。我期待如下。

expectNew(StreamSource.class, InputStream.class).andReturn(mockStreamSource);

当我运行powermocks时会抛出一个错误说。

java.lang.AssertionError: 
  Unexpected constructor call javax.xml.transform.stream.StreamSource(null):
    javax.xml.transform.stream.StreamSource(class java.io.InputStream): expected: 1, actual: 0

原因是因为我认为getClass()。getClassLoader()。getResourceStream(“..”)无论如何都返回null。因此,powermock没有发现它对expectNew描述的初始化有用。怎么说期望null输入流作为参数。我尝试使用null。没用。

expectNew(StreamSource.class, null).andReturn(mockStreamSource);

1 个答案:

答案 0 :(得分:1)

如果你正在使用easymock:

将工厂的创建提取为受保护的方法。

protected SchemaFactory createSchemaFactory(){
  return SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
}

在您的测试中,不是测试SUT本身而是创建SUT的部分模拟版本,仅模拟静态调用完成的新方法,并对其进行测试。 Partial mocks using easymock