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

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

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

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

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

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

@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();
    }
}

Ответы (1 шт):

Автор решения: Albert Akimov

Вопрос снимается, решил самостоятельно. Ещё раз хочу скачать, что я хотел сделать абстрактный класс для тестирования сущностей (Добавить, Выбрать, Удалить, обновить). По скольку для все сущностей один и тот же кейс, то не зачем писать однотипный код каждый раз - это будет раздражать.

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

Я поступил проще. Сделал метод Init() передаю туда объект сущности и вызываю метод runTest(). Соответственно конструкторы все убрал. Слой сервиса автоварится в базовом классе, по скольку JUnit поднимает полный контекст spring-а.

@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("[email protected]");
        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());

    }

}
→ Ссылка