powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Junit Services Тестирование метода
20 сообщений из 20, страница 1 из 1
Junit Services Тестирование метода
    #37923864
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

У меня есть класс, UserDAO , у которого есть метод getUserList() , который возвращает список всех пользователей, которые есть в базе.

И еще есть сервис UserService , который выглядит ориентировочно так:

Код: 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.
@Service /* Spring @Service annotation */
public class UserService {
     List<User> userList = new ArrayList<User>();

    @Autowired
    private UserDAO userDAO;
    
    @PostConstruct
    public void startUp() {
        userList.addAll(userDAO.getUserList());
    }    

    public List<User> getUserList() {
       return new ArrayList<User>(userList);
    }

    public void add(User user) {
        userDAO.add(user);

        userList.add(user);
    }

    public void delete(User user) {
         userDAO.delete(user);
        
         /* удаляем объект из userList */
    }

    public List<User> getUserBySomeFilter() {
        List<User> resultList = new ArrayList<User>();

        for (User user : getUserList()) {
            if (/* какой-то код, который проверяет удовлетворяет ли пользователь заданному фильтру или нет */) {
                resultList.add(user);
            }
        }

        return resultList;
    }

    public List<User> getUserByAnotherFilter() {
        List<User> resultList = new ArrayList<User>();

        for (User user : getUserList()) {
            if (/* какой-то код, который проверяет удовлетворяет ли пользователь какому-то заданному фильтру или нет */) {
                resultList.add(user);
            }
        }

        return resultList;
    }
}




Мне нужно протестировать, что при имеющемся фиксированном userList, метод, например, getUserBySomeFilter возвращает правильный список пользователей.

Дело в том, что этот класс (UserService) может использоваться в каком-то тесте, и там например будет вызвана операция add или delete, и тогда я уже не могу гарантировать, что состояние UserService неизменно между вызовами getUserList и getUserListByFilter.

Как быть?
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37923877
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-1, метод List<User> getUserList() вполне мог бы возвращать userList - не обязательно ещё один объект создавать.

Во-2, когда коллекция активно используется для добавления и удаления элементов, использовать ArrayList не эффективно - при превышении количества "ячеек" под элементы, созданных при инициализации (кажется по умолчанию 5), ArrayList каждый раз пересоздается при добавлении нового элемента. То есть лучше использовать для этого LinkedList.

В-3, из вопроса о "правильном списке пользователей" непонятны критерии правильности. Не пустой? - assertNotNull. Содержит определённое количество элементов? - assertEquals(expectedCount, userList.size()). Интересует точное совпадение списков до буквы? - перевести в массивы и вызвать assertArrayEquals.

В-4, про "состояние UserService" можно не беспокоиться. JUnit не только запускает каждый тест в виде отдельного приложения, но и, вроде бы, отдельным класслоадером.
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37923885
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

О_о то есть объект UserService уже не гарантированный singleton для разных тестов?
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37923904
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksmesier,
О_о то есть объект UserService уже не гарантированный singleton для разных тестов?
Чиво-чиво??
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37923918
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

Ну вот есть допустим два теста:

UserServiceTest и HotelServiceTest

и типа они выглядят вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring-test-db.xml"})
public class UserServiceTest {
   @Autowired
   private UserService userService;

   ...
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring-test-db.xml"})
public class HotelServiceTest {
   @Autowired
   private UserService userService;

   ...
}
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37923926
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks выглядят вот так:
Хорошо выглядят.. )))
А вопрос (проблема) в чем?
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924145
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier, ну они оба могут использовать метод add у объекта userService

Код: 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.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring-test-db.xml"})
public class UserServiceTest {
   @Autowired
   private UserService userService;

   ...

   @Test
   public void shouldSaveUser() {
      User user = new User();
      // ... 
      userService.add(user);

      // проверяем, что объект сохранен
      // ...
       
       // удаляем объект
      userService.delete(user);
   } 
}



@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring-test-db.xml"})
public class HotelServiceTest {
   @Autowired
   private UserService userService;

   @Test
   public void shouldSaveHotelUser() {
     
       // ... 
       userService.add(user);
   }
}
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924491
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? )))
Порядочные разработчики все классы persistence-слоя мокают, а методы - стабят!
А что будет если твои классы отдать тестеру, у которого нет доступа к БД?
Для затравочки: Mockito
Первое правило юнит-тестирования - тестируем поведение а не код!
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924508
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
офф: вообще не работал с тестированием и не понимаю для чего оно нужно :)
Если вкратце, очень вкратце - оно зачем вообще? Можно ссылкой, но лучше так, на пальцах ))
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924557
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicофф: вообще не работал с тестированием и не понимаю для чего оно нужно :)
Если вкратце, очень вкратце - оно зачем вообще? Можно ссылкой, но лучше так, на пальцах ))

О_о
Заканчивается 2012 год, ребята!.. )))

Пример (утрировано): разработчику компьютерной игры понадобилось протестировать и отладить битву с Главным Монстром, когда и сам персонаж уже стал прокачанным эльфом 80-го уровня. Сколько времени понадобится на компиляцию, сборку, возможно установку, и прохождение игры, для того чтобы проверить как работает нужное место программы? Будет ли проект сдан вОвремя? Скандалы-интриги-расследования..
Логично выглядит проверка работы отдельно от всей игры этого места программы с возможностью задать какие-то параметры выполнения. Это и есть модульное тестирование.
Модульное тестирование доступно только программисту - только он знает какие методы вызываются в том или ином месте программы, какие параметры должны им передаваться, их диапазон значений, и какой результат при этом ожидается на выходе из метода.
Язык Java дает нам замечательную возможность - мы можем в любом классе создать экземпляр другого класса и выполнить его методы.. Это и будет примитивный юнит-тест. Библиотеки же для юнит-тестирования дают расширенные возможности - моки, стабы, ассерты. Причем, JUnit, как говорят, ещё не самый удобный..
Юнит-тестирование, TDD, если его изучить настолько хорошо, что на написание теста для метода будет уходить не более 10-20 минут, существенно сокращает время отладки, оччень экономит нервные клетки при дальнейшем функциональном тестировании!
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924763
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicс тестированием и не понимаю для чего оно нужно букварик типа
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924786
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

На самом деле ты работаешь с тестами постоянно.
Ты пишешь код, запускаешь программу и смотришь, работает она или нет. И так до релиза у тебя в main() находится главный и единственный тест твоей программы
Пока ты в угаре и помнишь проект наизусть, этого может хватать.
Но чтоьы не держать все в голове, и быстро получать отчет о том что работает а что сломалось, придуманы юнит-тесты. Тест воссоздает рабочую ситуацию и дает информацию о работоспособности компонент системы. В общем это какбы отдельные main на разные случаи жизни, может так легче понять.
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37924817
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманNixic,...
Но чтоьы не держать все в голове, и быстро получать отчет о том что работает а что сломалось, придуманы юнит-тесты. Тест воссоздает рабочую ситуацию и дает информацию о работоспособности компонент системы. В общем это какбы отдельные main на разные случаи жизни, может так легче понять.
Вооот, вот это полезная вещь! А то поменяешь что-то, то тут то там, и то, что делал два месяца назад уже могло и "полететь"...
Спасибо ВСЕМ за инфу...
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37925414
marx_freedom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierВо-1, метод List<User> getUserList() вполне мог бы возвращать userList - не обязательно ещё один объект создавать.


таким образом автор отдаст во внешний код "реальную" коллекцию с данными, которую внешний код может испортить самостоятельно. имхо копирование к месту. но вот к месту ли такой кэш в памяти, когда есть бд - уже вопрос :)
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37925509
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marx_freedom,

мое дело не оценивать код, а написать к нему тесты :)

mesier Так ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? )))
Порядочные разработчики все классы persistence-слоя мокают, а методы - стабят!
А что будет если твои классы отдать тестеру, у которого нет доступа к БД?
Для затравочки: Mockito
Первое правило юнит-тестирования - тестируем поведение а не код!

Я вот не очень понимаю до конца суть тестирования поведения видимо. Поясните пожалуйста, вот скажем есть у нас это userList и есть два метода, например такие:

Код: 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.
public List<User> getUserListByFilter() {
    List<User> resultList = new ArrayList<User>(); 

    Filter filter = new SomeFilter();
    
    for (User user : userList) {
       if (filter.accept(user)) {
            resultList.add(user);
       }
    }
   
    return resultList;
}

public List<User> getUserListByAnotherFilter() {
    List<User> resultList = new ArrayList<User>(); 

    Filter filter = new SomeAnotherFilter();
    
    for (User user : userList) {
       if (filter.accept(user)) {
            resultList.add(user);
       }
    }

    return resultList;
}
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37925543
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело этих геттеров - возвращать данные. А вот есть ещё там какой-то filter - его дело фильтровать.
Вот и надо проверять, что геттер возвращает, а фильтр фильтрует.. ))
(подсунув какие-то придуманные данные на вход, чтобы убедиться, что оно всё фильтрует и возвращает именно так, как мы того хотим)
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37925609
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

ну я так понимаю тест код будет проверять, что

1. вызывался метод accept
2. и если метод accept вызывался и вернул true, то должен был вызываться add у списка?
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37925718
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksmesier,
ну я так понимаю тест код будет проверять, что
1. вызывался метод accept
2. и если метод accept вызывался и вернул true, то должен был вызываться add у списка?
Как вариант..
Но не проще ли проверить, что в ответ на загруженный в тест-класс список сферических условных пользователей Иванов-Петров-Сидоров-Пидоров:
1) userList не пуст и в нем все четверо;
2) accept() возвращает true или false тогда, когда это надо;
3) метод getUserListByFilter() вернул Иванова-Петрова, а второй Сидорова - то есть так, как это и ожидалось. (к примеру! я ж не знаю как там фильтры фильтруют их)
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37927383
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,
...
Рейтинг: 0 / 0
Junit Services Тестирование метода
    #37927781
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierТак ты что ли в юнит-тестах с реальными данными работаешь, в БД лазиешь? )))
Смотря что тестируется. Если тестируется DAL - то да, именно в БД и ходим. Если тестируется слой сервис, то конечно же все DAO заменяются моками.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Junit Services Тестирование метода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]