Как удалить ParserConfigurationException из DocumentBuilderFactory.newInstance (). NewDocumentBuilder () [duplicate]

Вы можете использовать grep -ilR:

grep -Ril "text-to-find-here" /
  • i означает случай игнорирования (необязательно в вашем случае).
  • R означает рекурсивный.
  • l означает «показать имя файла, а не сам результат».
  • / означает начало в корне вашей машины.
5
задан user3778446 4 September 2014 в 07:46
поделиться

3 ответа

Ваш тест не проходит, потому что вы точно ловите ParserConfigurationException в своем методе, поэтому его никогда не бросают. Чтобы пройти тест:

1) измените подпись вашего метода (исключение бросания)

public String createCompleteExportXml(String xmlFilename, String content) throws ParserConfigurationException {

2) Бросьте ParserConfigurationException. Для этого вы можете удалить блок catch или выбросить исключение после LOGGER.trace. Пример для второго варианта:

  try {
     //...
  } catch (ParserConfigurationException pce) {
     LOGGER.trace("parsing error ", pce);
     throw pce;
  }

Надеюсь, он вам поможет

[UPDATE]

Если вы хотите имитировать ParserConfigurationException, вы можете использовать фреймворк, подобный Mockito / PowerMock, чтобы высмеять DocumentBuilderFactory и имитировать, что ParserConfigurationException вызывается, когда вызывается метод newDocumentBuilder().

Пример:

@RunWith(PowerMockRunner.class)
@PrepareForTest(DocumentBuilderFactory.class)
public class XmlFileWriterTest {

   @Test(expected = ParserConfigurationException.class)
   public void createCompleteExportXmlWithParseConfigurationException() throws Exception {
      String xmlFilename = "junitExportTestWithParseConfigurationException.xml";
      String content = "any content";
      XmlFileWriter writer = new XmlFileWriter();

      // Mock DocumentBuilderFactory: When method newDocumentBuilder() is called, throws a simulated ParserConfigurationException
      DocumentBuilderFactory mockDocumentBuilderFactory = PowerMockito.mock(DocumentBuilderFactory.class);
      PowerMockito.when(mockDocumentBuilderFactory.newDocumentBuilder()).thenThrow(new ParserConfigurationException("Simulated ex"));

      // Mock DocumentBuilderFactory.newInstance(), when is called, returns your mock instance mockDocumentBuilderFactory
      PowerMockito.mockStatic(DocumentBuilderFactory.class);
      PowerMockito.when(DocumentBuilderFactory.newInstance()).thenReturn(mockDocumentBuilderFactory);

      writer.createCompleteExportXml(xmlFilename, content);
   }

Этот тестовый проход ( с предыдущими предложениями кода).

Зависимости Maven для powerMock:

<dependency>
     <groupId>org.powermock</groupId>
     <artifactId>powermock-module-junit4</artifactId>
     <version>1.5.4</version>
  </dependency>

  <dependency>
     <groupId>org.powermock</groupId>
     <artifactId>powermock-api-mockito</artifactId>
     <version>1.5.4</version>
  </dependency>

Надеюсь, это будет то, что вы ищете.

Вы можете найти больше документация Mockito и PowerMock

2
ответ дан troig 22 August 2018 в 18:57
поделиться
  • 1
    Благодарю. Я собираюсь изменить свой код в соответствии с вашим предложением. Но на самом деле я спрашиваю, как смогу имитировать ошибку ParserConfigurationException. Как я могу сделать documentFactory.newDocumentBuilder () не в состоянии работать, потому что «DocumentBuilder не может быть создан, который удовлетворяет запрошенной конфигурации.»? Где конфигурация? Как я могу его изменить? – user3778446 4 September 2014 в 07:39
  • 2
    Привет, взгляните на мое обновление ответа. Вы можете использовать насмешливую структуру, такую ​​как Mockito / PowerMock, чтобы имитировать исключение ParserConfigurationException. Надеюсь, это поможет вам. – troig 4 September 2014 в 08:04
  • 3
    Пример настолько хорош, что мне просто нужно было скопировать и вставить, но когда я щелкнул правой кнопкой мыши класс и запустил его как тест junit. Я получил: сообщение там (см. Мое издание после вашего кода) – user3778446 4 September 2014 в 14:22
  • 4
    Hummm ... Я игнорирую, как вы его запускаете. С IntellijIdea maven работает правильно. Я думаю, ты что-то забыл ... Куд, ты даешь мне больше информации? – troig 4 September 2014 в 14:35
  • 5
    Кажется, это проблема с версиями junit / PowerMock, которые вы используете. Взгляните на этот пост . Попробуйте запустить с junit 4.9 (если вы используете стих-макет, который я публикую в своем ответе) – troig 4 September 2014 в 14:39

Я не думаю, что какой-либо из существующих ответов действительно ответил на вопрос, так что вот мой подход к этому.

Подходите к одному, пользуясь внутренними компонентами com.sun. *:

(класс-помощник)

import com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.validation.Schema;
import javax.xml.validation.Validator;
import javax.xml.validation.ValidatorHandler;

public class MisconfiguredDocumentBuilderFactory extends DocumentBuilderFactoryImpl {
    @Override
    public DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {

        super.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
           "http://www.w3.org/2001/XMLSchema");
        super.setSchema(new Schema() {
            @Override
            public Validator newValidator() {
                return null;
            }

            @Override
            public ValidatorHandler newValidatorHandler() {
                return null;
            }
        });
        return super.newDocumentBuilder();
    }
}

(Фактический тестовый класс)

public class OPClassTest {
    private final static String DOC_BUILDER_PROPERTY_NAME =
        "javax.xml.parsers.DocumentBuilderFactory";

    @Test
    public void testParserConfigurationProblem() {
        System.setProperty(DOC_BUILDER_PROPERTY_NAME,
            MisconfiguredDocumentBuilderFactory.class.getCanonicalName());
        targetClass.createCompleteExportXml("somefilename", "somecontent");
    }
    @After
    public void tearDown() {
        System.clearProperty(DOC_BUILDER_PROPERTY_NAME);
    }
}

Подход 2 без использования com.sun. * namespaces

(Класс помощника)

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class MisconfiguredDocumentBuilderFactory2 extends DocumentBuilderFactory {
    @Override
    public DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {

        throw new ParserConfigurationException(
            "this factory is not configured properly");
    }

    @Override
    public void setAttribute(String name, Object value) throws IllegalArgumentException {
        // no-op
    }

    @Override
    public Object getAttribute(String name) throws IllegalArgumentException {
        return null;
    }

    @Override
    public void setFeature(String name, boolean value) throws ParserConfigurationException {
        // no-op
    }

    @Override
    public boolean getFeature(String name) throws ParserConfigurationException {
        return false;
    }
}

(Фактический тестовый класс)

public class OPClassTest {
    private final static String DOC_BUILDER_PROPERTY_NAME =
        "javax.xml.parsers.DocumentBuilderFactory";

    @Test
    public void testParserConfigurationProblem() {
        System.setProperty(DOC_BUILDER_PROPERTY_NAME,
            MisconfiguredDocumentBuilderFactory2.class.getCanonicalName());
        targetClass.createCompleteExportXml("somefilename", "somecontent");
    }
    @After
    public void tearDown() {
        System.clearProperty(DOC_BUILDER_PROPERTY_NAME);
    }
}
3
ответ дан eis 22 August 2018 в 18:57
поделиться
  • 1
    Да, но где я могу определить схему дважды в своем тесте? – user3778446 4 September 2014 в 14:19
3
ответ дан eis 5 November 2018 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: