Попытка разобрать XML с помощью SAX, но ни один из моих тестов JUnit не работает?

1

Поэтому я пытаюсь запустить различные тесты, чтобы проверить правильность моего синтаксиса XML. К сожалению, ни один из них не проходит, что я предполагаю, потому что мой XML файл не хранится правильно в ArrayList. Буду признателен за любую помощь!

VideoFile.java:

package server;

public class VideoFile {
    private int id;
    private String title;
    private String filename;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }  
}

XMLReader.java:

package server;


import java.io.File;
import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;



public class XMLReader extends DefaultHandler {

    //List to hold VideoFiles object
    private List<VideoFile> videoList = null;
    private VideoFile emp = null;


    //getter method for employee list
    public List<VideoFile> getList() {
        return videoList;
    }


    boolean bTitle = false;
    boolean bFilename = false;


    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {

        if (qName.equalsIgnoreCase("video")) {
            //create a new VideoFile and put it in Map
            String id = attributes.getValue("id");
            //initialize VideoFile object and set id attribute
            emp = new VideoFile();
            emp.setId(Integer.parseInt(id));
            //initialize list
            if (videoList == null)
                videoList = new ArrayList<>();
        } else if (qName.equalsIgnoreCase("title")) {
            //set boolean values for fields, will be used in setting VideoFile variables
            bTitle = true;
        } else if (qName.equalsIgnoreCase("filename")) {
            bFilename = true;
        }    
    }


    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equalsIgnoreCase("video")) {
            //add VideoFile object to list
            videoList.add(emp);
        }
    }


    @Override
    public void characters(char ch[], int start, int length) throws SAXException {

        if (bTitle) {
            emp.setTitle(new String(ch, start, length));
            bTitle = false;
        } else if (bFilename) {
            emp.setFilename(new String(ch, start, length));
            bFilename = false;
        }
    }

    public static void main(String[] args) {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        SAXParser saxParser = saxParserFactory.newSAXParser();
        XMLReader handler = new XMLReader();
        saxParser.parse(new File("videoList.xml"), handler);
        //Get VideoFiles list
        List<VideoFile> videoList = handler.getList();
        //print employee information
        for(VideoFile emp : videoList)
            System.out.println(emp);
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
    }
}

XMLReaderTest.java:

package server;

import static org.junit.Assert.*;
import java.util.List;
import org.junit.Before;
import org.junit.Test;

public class XMLReaderTest {
    private XMLReader reader;
    private List<VideoFile> videoList;

    @Before
    public void setUp() throws Exception {
        reader = new XMLReader();
        videoList = reader.getList();
    }

    @Test
    public void createListOfVideos() {
        assertTrue(videoList instanceof List);
    }

    @Test
    public void listContainsVideoFiles() {
        assertTrue(videoList.get(0) instanceof VideoFile);
    }

    @Test
    public void videoFileReturnsCorrectFields() {
        VideoFile videoFile = videoList.get(0);
        assertNotNull(videoFile.getId());
        assertNotNull(videoFile.getTitle());
        assertNotNull(videoFile.getFilename());
    }

    @Test
    public void videoFileReturnsCorrectData() {
        VideoFile videoFile = videoList.get(0);
        assertEquals("201202132", videoFile.getId());
        assertEquals("Monsters Inc.", videoFile.getTitle());
        assertEquals("monstersinc_high.mpg", videoFile.getFilename());
    }
}

videoList.xml:

<?xml version="1.0"?>
<videoList version="sample">
    <video id="4352524242">
        <title>Video 1</title>
        <filename>vid1_high.mpg</filename>
    </video>
    <video id="20120102b7">
        <title>Video 2</title>
        <filename>vid2-featurehp.mp4</filename>
    </video>
    <video id="1242102b7">
        <title>Vid3</title>
        <filename>vid3-featureukFhp.mp4</filename>
    </video>
</videoList>
  • 0
    С JAXB ваш код будет намного проще.
Теги:
junit
sax

1 ответ

2
Лучший ответ

Ваши тесты терпят неудачу, потому что ваш код не анализирует XML, а ваш список видео остается нулевым. Документ XML действителен, но код, который его анализирует, не запускается.

Единственный код, который анализирует XML-документ, находится в main методе XMLReader. Поскольку XMLReader не является основным классом (основным классом будет класс JUnit test runner), его main метод игнорируется.

Переместите код обработки XML из main метода и убедитесь, что ваш тест вызывает его.

  • 0
    Извините за ответ и спасибо за вашу помощь! Я обновил код, и теперь он выполняется отлично. Что касается тестов, то, что сделал мой лектор, не совсем имеет для меня смысл. Я не понимаю, почему он загружает файл XML снова отдельно, когда он уже загружен в XMLReader? Как я могу использовать контрольные примеры для сравнения с сгенерированным ArrayList, а не с файлом напрямую?
  • 0
    @ user1929131: Извините, я не понимаю ваш комментарий. Ваши тесты сравнения против ArrayList , который был возвращен из XMLReader.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню