создайте StreamSource с помощью getClass().getClassLoader().getResourceStream(

Я публикую этот вопрос, и я получил некоторые объяснения, но не смог решить проблему. Теперь, когда у меня появилось лучшее понимание, я собираюсь опубликовать это снова в новом ракурсе.

У меня есть следующие строки в моем узле.

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

or

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 следующим образом.

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. не работал.

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

person Susitha Ravinda Senarath    schedule 16.10.2013    source источник
comment
Будет ли ваш код более тестируемым, если вы передадите StreamSource, а не создадите его внутри метода?   -  person Joe    schedule 16.10.2013
comment
@Joe Да, но изменить код сейчас сложно.   -  person Susitha Ravinda Senarath    schedule 21.10.2013


Ответы (1)


Если вы используете easymock:

Извлеките создание фабрики в защищенный метод.

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

В вашем тесте вместо проверки самой ТУС создайте частично имитированную версию вашей ТУС, имитируя только новый метод, в котором выполняется статический вызов, и протестируйте его. Частичные макеты с использованием easymock.

person diegomtassis    schedule 18.10.2013
comment
Да, это работает. Но все же мне нужно заставить это работать с текущим кодом. - person Susitha Ravinda Senarath; 21.10.2013
comment
Вы имеете в виду, что вам нужно протестировать метод, но вы не можете провести рефакторинг? Это нужно знать. - person diegomtassis; 21.10.2013
comment
да в силу некоторых обстоятельств не могу. Усилие состоит в том, чтобы поднять охват. - person Susitha Ravinda Senarath; 22.10.2013