Junit 使用getClass().getClassLoader().getResourceStream创建StreamSource(

Junit 使用getClass().getClassLoader().getResourceStream创建StreamSource(,junit,mocking,junit4,easymock,powermock,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

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

我的节点中有以下几行

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));

为了做第一件,我已经做了两天的头发了

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

但是没有起作用

expectNew(StreamSource.class, null).andReturn(mockStreamSource);
现在我试着模仿第二行

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描述的初始化一样。如何说Expecting一个null inputstream作为参数。我试着只使用null。不起作用

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

如果您使用的是easymock:

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

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

在测试中,不要测试SUT本身,而是创建一个部分模拟的SUT版本,只模拟执行静态调用的新方法,并对其进行测试。

如果使用easymock:

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

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

在您的测试中,不是测试SUT本身,而是创建一个部分模拟的SUT版本,只模拟执行静态调用的新方法,并对其进行测试。

如果您传入了
流源代码,而不是在方法中构建它,您的代码会更易于测试吗?@Joe是的,但现在更改代码有点困难。W如果你传入一个
StreamSource
,而不是在方法中构建代码,你的代码会更容易测试吗?@Joe是的,但现在更改代码有点困难。是的,这是可行的。但我仍然需要用当前代码进行测试。你的意思是你必须测试方法,但你不能重构吗?这是一个需要知道的点。是的,因为某些curcumstances我不能。努力是为了提高覆盖率。是的,这是可行的。但我仍然需要用当前代码来实现这一点。你的意思是你必须测试这个方法,但你不能重构吗?这是一个需要知道的问题。是的,由于一些姜黄素我不能。努力是为了提高覆盖率。