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

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

17.09.2018, 13:41. Показов 3470. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru