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我不能。努力是为了提高覆盖率。是的,这是可行的。但我仍然需要用当前代码来实现这一点。你的意思是你必须测试这个方法,但你不能重构吗?这是一个需要知道的问题。是的,由于一些姜黄素我不能。努力是为了提高覆盖率。