Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111

Тестирование вспомогательных методов

17.09.2018, 13:41. Показов 3238. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И еще один вопрос по тестированию... Нужно ли тестировать вспомогательные методы? Они как правило закрыты. Например, есть метод, который парсит xml файл:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void parseNodeList(NodeList childNodes, Employee employee) {
            for (int i = 0; i < childNodes.getLength(); i++) {
                Node nextChildNode = childNodes.item(i);
                if (nextChildNode.getNodeType() == Node.ELEMENT_NODE) {
                    if (nextChildNode.getNodeName().equals("id"))
                        employee.setId(Integer.parseInt(nextChildNode.getTextContent()));
                    if (nextChildNode.getNodeName().equals("name"))
                        employee.setName(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("base"))
                        employee.setBase(Double.parseDouble(nextChildNode.getTextContent()));
                    if (nextChildNode.getNodeName().equals("workTime"))
                        employee.setWorkTime(Double.parseDouble(nextChildNode.getTextContent()));
                    if (nextChildNode.getNodeName().equals("position"))
                        employee.setPosition(nextChildNode.getTextContent());
                    if (nextChildNode.getNodeName().equals("subordinates"))
                        employee.setSubordinates(Integer.parseInt(nextChildNode.getTextContent()));
                    if (nextChildNode.getNodeName().equals("project")) {
                        Element element = (Element) nextChildNode;
                        double budget = Double.parseDouble(element.getAttribute("budget"));
                        NodeList projectList = ((Element) nextChildNode).getElementsByTagName("personalInput");
                        double personalInput = Double.parseDouble(projectList.item(0).getTextContent());
                        Double[]arr={budget,personalInput};
                        NodeList projectList2 = ((Element) nextChildNode).getElementsByTagName("title");
                        String projectTitle = projectList2.item(0).getTextContent();
                        employee.getProject().put(projectTitle,arr);
                    }
 
                }
            }
        }
или который выполняет инициализацию объектов из списка:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private void loadStaff() throws ParserConfigurationException, IOException, SAXException {
            String[] pos = {"Cleaner", "Driver", "Programmer", "Tester", "TeamLeader", "Manager", "ProjectManager", "SeniorManager"};
            Employee employee = null;
            AccountingDepartment accountingDepartment = new AccountingDepartment();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node nextNode = nodeList.item(i);
                if (nextNode.getNodeType() == Node.ELEMENT_NODE) {
                    for (int j = 0; j < pos.length; j++) {
                        if (nextNode.getNodeName().equals(pos[j])){
                            switch (j) {
                                case 0:
                                    employee = new Cleaner();
                                    break;
                                case 1:
                                    employee = new Driver();
                                    break;
                                case 2:
                                    employee = new Programmer();
                                    break;
                                case 3:
                                    employee = new Tester();
                                    break;
                                case 4:
                                    employee = new TeamLeader();
                                    break;
                                case 5:
                                    employee = new Manager();
                                    break;
                                case 6:
                                    employee = new ProjectManager();
                                    break;
                                case 7:
                                    employee = new SeniorManager();
                                    break;
                            }
                        }
                    }
                    employees.add(employee);
                    NodeList childNodes = nextNode.getChildNodes();
                    parseNodeList(childNodes, employee);
                    employee.setPayment(accountingDepartment.getPayment(employee));
                }
            }
        }
Не совсем понятно... Или может методы нужно отрефакторить как-то.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2018, 13:41
Ответы с готовыми решениями:

Тестирование методов
Здравствуйте! Такая проблема: если допустим есть метод public int sum(int first, int second) { return first + second; ...

Тестирование приватных методов.
Подскажите пожалуйст,как можо тестировать приватные методы с помощю JUnit ? Мне говорили что с помощю Рефлексии,но я почитал и не понял...

Тестирование методов через JUnit
Доброго времени суток Помогите пожалуйста. Есть такой метод для удаления файлов private void deleteFile(FileElement fi) { ...

27
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
19.09.2018, 09:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Njula Посмотреть сообщение
Нужно ли тестировать вспомогательные методы?
Если они критичны для бизнес-логики и нетривиальны -- в обязательном порядке. Только ни за что не подстраивайте код под тесты.
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
19.09.2018, 11:52  [ТС]
HighPredator, спасибо!

Добавлено через 48 минут
JIeIIIa, я понимаю, что метод loadStaff загружает реальные объекты, созданные из данных xml, а я, когда пытаюсь определить количество вызовов метода mockFormat.printEmployee, предаю последнему заглушку. Получается несоответствие. Видимо я также должен использовать вместо реальных данных заглушку? Как это сделать?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
19.09.2018, 19:28
Njula, покажите класс с printStaff.
Если говорим о юнит тестах, то один тест проверяет однин метод. По хорошему printStaff должен только печатать и не важно откуда берутся данные. Более того если Вы тестируете печать и при этом загружаете данные из БД/файла/т.п., то тест может падать или потому, что печать не верная, или потому что данные не верно загрузились.
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
19.09.2018, 22:14  [ТС]
JIeIIIa, printStaff - это метод класса Main. Вот код полностью.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 public class Main {
 
        List<Employee> employees = new ArrayList();
 
        public Main() throws ParserConfigurationException, IOException, SAXException {}
 
        private NodeList createNodeList() throws ParserConfigurationException, IOException, SAXException {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(getClass().getResourceAsStream("/Staff.xml"));
            Node rootNode = doc.getFirstChild();
            NodeList nodeList = rootNode.getChildNodes();
            return nodeList;
        }
 
        private void loadStaff() throws ParserConfigurationException, IOException, SAXException, IllegalAccessException, InstantiationException {
 
            AccountingDepartment accountingDepartment = new AccountingDepartment();
            Employee employee = null;
            Map<String, Class<? extends Employee>> map = new HashMap();
            map.put("Cleaner", Cleaner.class);
            map.put("Driver", Driver.class);
            map.put("Programmer", Programmer.class);
            map.put("Tester", Tester.class);
            map.put("TeamLeader", TeamLeader.class);
            map.put("Manager", Manager.class);
            map.put("ProjectManager", ProjectManager.class);
            map.put("SeniorManager", SeniorManager.class);
 
            NodeList nodeList = createNodeList();
 
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node nextNode = nodeList.item(i);
                if (nextNode.getNodeType() == Node.ELEMENT_NODE) {
                    if (map.containsKey(nextNode.getNodeName()))
                    employee = map.get(nextNode.getNodeName()).newInstance();
                    employees.add(employee);
                    NodeList childNodes = nextNode.getChildNodes();
                    parseNodeList(childNodes, employee);
                    employee.setPayment(accountingDepartment.getPayment(employee));
                }
            }
        }
 
        private void parseNodeList(NodeList childNodes, Employee employee) {
            try {
                for (int i = 0; i < childNodes.getLength(); i++) {
                    Node nextChildNode = childNodes.item(i);
                    if (nextChildNode.getNodeType() == Node.ELEMENT_NODE) {
                        if (nextChildNode.getNodeName().equals("id"))
                            employee.setId(Integer.parseInt(nextChildNode.getTextContent()));
                        if (nextChildNode.getNodeName().equals("name"))
                            employee.setName(nextChildNode.getTextContent());
                        if (nextChildNode.getNodeName().equals("base"))
                            employee.setBase(Double.parseDouble(nextChildNode.getTextContent()));
                        if (nextChildNode.getNodeName().equals("workTime"))
                            employee.setWorkTime(Double.parseDouble(nextChildNode.getTextContent()));
                        if (nextChildNode.getNodeName().equals("position"))
                            employee.setPosition(nextChildNode.getTextContent());
                        if (nextChildNode.getNodeName().equals("subordinates"))
                            employee.setSubordinates(Integer.parseInt(nextChildNode.getTextContent()));
                        if (nextChildNode.getNodeName().equals("project")) {
                            Element element = (Element) nextChildNode;
                            double budget = Double.parseDouble(element.getAttribute("budget"));
                            NodeList projectList = ((Element) nextChildNode).getElementsByTagName("personalInput");
                            double personalInput = Double.parseDouble(projectList.item(0).getTextContent());
                            Double[] arr = {budget, personalInput};
                            NodeList projectList2 = ((Element) nextChildNode).getElementsByTagName("title");
                            String projectTitle = projectList2.item(0).getTextContent();
                            employee.getProject().put(projectTitle, arr);
                        }
                    }
                }
            }catch (NumberFormatException nfe){
                System.err.println("Введены неверные символы!");
            }
        }
 
        static class Format{
 
            String printHeadPersonal(){
                return String.format("%-5s %15s %38s %12s %20s %9s\n","ID", "ФИО", "Должность", "Ставка", "Отработанное время","Зарплата")+
                        String.format("%-5s %15s %35s %14s %13s %15s","---","---","---","---","---","---");
            }
 
            String printEmployee(Employee employee){
                return String.format("%-5d %-35s %-25s %5.1f %13.1f %16.1f", employee.getId(), employee.getName(), employee.getPosition(),
                        employee.getBase(), employee.getWorkTime(), employee.getPayment());
            }
        }
 
        public void printStaff(Format format) throws ParserConfigurationException, IllegalAccessException, InstantiationException, SAXException, IOException {
 
            loadStaff();
            System.out.println(format.printHeadPersonal());
            for (Employee employee:employees){
                System.out.println(format.printEmployee(employee));
            }
        }
 
        public static void main(String[] args) throws IOException, ParserConfigurationException, InstantiationException, SAXException, IllegalAccessException {
            Main staff = new Main();
            staff.printStaff(new Format());
        }
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
19.09.2018, 22:25
Лучший ответ Сообщение было отмечено Njula как решение

Решение

Njula, добавить в класс геттер-сеттер для Employee и уровнем доступа package-private. В начале теста создаете руками лист Employee, отдаете классу и запускаете тестируемый метод. Так же если будете тестировать метод loadStaff, то геттером получите что именно было загружено.
Не понятно почему метод printStaff должен что-то загружать.
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
19.09.2018, 22:40  [ТС]
JIeIIIa, спасибо!
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Не понятно почему метод printStaff должен что-то загружать.
- я добавил в него метод loadStaff только вчера, когда возился с тестами. Раньше я его просто вызывал из main(). Я решил, что раз у класса интерфейсом является единственный метод - printStaff(), значит он один и должен вызываться пользователем, соответственно при этом должны подгружаться объекты. Я не прав?

Добавлено через 3 минуты
Цитата Сообщение от JIeIIIa Посмотреть сообщение
В начале теста создаете руками лист Employee
- получается все очень искусственно... Хотелось бы проверить конечно реально загружаемые объекты.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
19.09.2018, 22:46
Название метода не соответствует тому, что он делает. Назовите, например, loadAndPrintStaff(). А лучше выделить отдельно класс Staff и в нем методы load() и print().

Добавлено через 2 минуты
Цитата Сообщение от Njula Посмотреть сообщение
конечно реально загружаемые объекты
Так проверяйте) Но вот unit-тестов должно быть много и они должны быть маленькие (в том смысле, что на каждый метод/кейс). Сделайте отдельно метод, который будет проверять загрузку: скармливаете файл/бд/что-то еще, запускаете метод, проверяете что загрузилось. Идея в том, что Вы знаете что именно должно загрузиться и можете это проверить.
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
19.09.2018, 22:51  [ТС]
Цитата Сообщение от JIeIIIa Посмотреть сообщение
отдельно класс Staff и в нем методы load() и print().
- класс действительно напрашивается. Спасибо! И как это я не догадался про геттеры и сеттеры... Все ведь просто.

Добавлено через 4 минуты
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Но вот unit-тестов должно быть много и они должны быть маленькие
- все это непривычно для меня пока). Не могу вот так понять что и как тестировать. Спасибо Вам за помощь! Очень ваши советы помогают...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2018, 22:51
Помогаю со студенческими работами здесь

Тестирование методов, возвращающие сложные объекты
Привет! Тестируется все JUnit. Вот вопрос тут возник. Если методы, которые возвращают коллекции объектов. Руками их создавать -...

Завершающий слеш в тегах вспомогательных HTML методов
Доброго времени суток. Столкнулся с такой проблемой при использовании вспомогательных HTML методов. При использовании методов вроде ...

Тестирование приватных классов/методов
Не могу понять как мне тестировать приватные модули. Если я создаю тестовый проект для моего проекта, даю ему ссылку на мой проект и...

Юнит тестирование методов, работающих с файлами
Всем доброго времени суток! Возникла у меня небольшая проблема с тестированием методов, которые выполняют сериализацию объекта в XML, JSON....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru