Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 08.08.2017
Сообщений: 15

Абстрактный класс для тестирования POJO CRUD

30.05.2020, 19:30. Показов 2320. Ответов 3

Студворк — интернет-сервис помощи студентам
Коллеги, добрый день! Хочу сделать абстрактный параметризированный класс для тестирования POJO CRUD. В наследнике хочу передавать объект сущности, слой сервиса и вызывать метод супер класса runTest().

Но к сожалению JUnit не хочет работать так как я хочу.

Вот ошибка из стека

java.lang.Exception: Test class should have exactly one public zero-argument constructor


Скажите пожалуйста, что я делаю не так или как с Вашей точки зрения сделать лучше.


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
@Slf4j
public abstract class AbstractTestCRUD<E extends AbstractEntity, S extends CRUDService<E>>  {
 
    public final S service;
    public final E entity;
 
    @Autowired
    @SuppressWarnings("all")
    public AbstractTestCRUD(S service, E entity) {
        this.service = service;
        this.entity = entity;
    }
 
    private E save() {
        return service.save(entity);
    }
 
    private void delete() {
        service.delete(entity.getId());
    }
 
    private List<E> getAll() {
        return service.getAll();
    }
 
    private E getById() {
        return service.getById(entity.getId());
    }
 
    public void runTest() {
 
        log.info("running test's for entity: " + entity.getClass().getSimpleName());
 
        E result = save();
 
        Assert.assertEquals(entity.getId(), result.getId());
 
        Assert.assertEquals(entity.getId(), getById().getId());
 
    }
 
}
 
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@SpringBootConfiguration
@ContextConfiguration
public class TestUserCRUD extends AbstractTestCRUD<User, UserServiceImp> {
 
    public TestUserCRUD(UserServiceImp service) {
        super(service, new User());
    }
 
    @Test
    public void test_1() {
        runTest();
    }
}
Добавлено через 3 часа 52 минуты
Вопрос снимается, решил самостоятельно.
Ещё раз хочу скачать, что я хотел сделать абстрактный класс для тестирования сущностей (Добавить, Выбрать, Удалить, обновить). По скольку для все сущностей один и тот же кейс, то не зачем писать однотипный код каждый раз - это будет раздражать.

Я не понимаю почему JUnit валидирует рефлексией наличие параметров в конструкторе, но факт остаётся фактом.

Я поступил проще. Сделал метод Init() передаю туда объект сущности и вызываю метод runTest(). Соответственно конструкторы все убрал.
Слой сервиса автоварится в базовом классе, по скольку JUnit поднимает полный контекст spring-а.
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
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@SpringBootConfiguration
@ContextConfiguration
public class TestUserCRUD extends AbstractTestCRUD<User, UserServiceImp> {
 
    @Autowired
    private RoleRepository roleRepository;
 
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
 
    @Test
    public void test_1() {
 
        Role roleUser = roleRepository.findByName("ROLE_USER");
 
        List<Role> userRoles = new ArrayList<>();
        userRoles.add(roleUser);
 
        User user = new User();
        user.setUsername("test");
        user.setFirstName("test");
        user.setLastName("test");
        user.setId(999L);
        user.setPassword(passwordEncoder.encode("12345678"));
        user.setPasswordConfirm(passwordEncoder.encode("12345678"));
        user.setEmail("test@gmail.com");
        user.setPhone("89996669966");
        user.setRoles(userRoles);
        user.setStatus(Status.ACTIVE);
 
        init(user);
        runTest();
    }
}
 
 
@Slf4j
@Component
public abstract class AbstractTestCRUD<E extends AbstractEntity, S extends CRUDService<E>> {
 
    @Autowired
    @SuppressWarnings("all")
    private S service;
 
    private E entity;
 
    public void init(E entity) {
 
        if(entity != null)
            this.entity = entity;
    }
 
    private E save() {
        return service.save(entity);
    }
 
    private void delete() {
        service.delete(entity.getId());
    }
 
    private List<E> getAll() {
        return service.getAll();
    }
 
    private E getById() {
        return service.getById(entity.getId());
    }
 
    public void runTest() {
 
        Assert.assertNotNull(entity);
 
        log.info("running test's for entity: " + entity.getClass().getSimpleName());
 
        E result = save();
        Assert.assertEquals(entity.getId(), result.getId());
 
        Assert.assertEquals(entity.getId(), getById().getId());
 
    }
 
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2020, 19:30
Ответы с готовыми решениями:

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Изменить класс для описания комплексных чисел на абстрактный класс
Нужно изменить на абстрактное классы, не понимаю как? В файле Class1.cs: using System; using System.Collections.Generic; using...

Абстрактный класс для layout
Уважаемые, форумчане, помогите решить проблему. В приложении большое количество layout с одинаковыми view-элементами, а именно TextView и ...

3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.05.2020, 21:44
Я не понимаю почему JUnit валидирует рефлексией наличие параметров в конструкторе, но факт остаётся фактом.
Как по-твоему должен junit создавать экземпляр класса, если там нет дефолтного конструктора?
0
0 / 0 / 0
Регистрация: 08.08.2017
Сообщений: 15
31.05.2020, 13:21  [ТС]
Ну так беда в том, что если писать тест без заморочек с наследованием и вообще не определять конструктор, то работает.
Я определял 2 конструктора, один дефолтный, другой который мне нужен - не работает.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
31.05.2020, 13:45
Лучший ответ Сообщение было отмечено Albert Akimov как решение

Решение

Зачем тебе вообще в тестах конструктор? В поле автоварь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2020, 13:45
Помогаю со студенческими работами здесь

Описать абстрактный класс для операции
Опишите абстрактный класс объектов, для которых определены операции ==, =, !=. Операцию == определите полностью для случая, когда объекты...

Абстрактный класс для парсинга сайа
Добрый день форумчане, подскажите что можно вынести в абстр. класс или интрефейс при создании модуля для парсинга страниц разных сайтов. ...

Абстрактный класс для работы с геометрическими фигурами
Создать абстрактный класс для работы с геометрическими фигурами. Предусмотреть такие компоненты- свойства класса: координаты центра фигуры;...

Использовать интерфейс/абстрактный класс для оптимизации
Всем привет Как здесь лучше оптимизировать код, потому что повторяюсь. Не хочется выносить повторение в отдельный метод и вызывать его...

Определить абстрактный класс для работы с денежными суммами
Ребят, тут такое дело, завис над задачей: Определить абстрактный класс Сurrency для работы с денежными суммами. Определить в нем методы...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru