Абстрактный класс для тестирования 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 шт):
Вопрос снимается, решил самостоятельно. Ещё раз хочу скачать, что я хотел сделать абстрактный класс для тестирования сущностей (Добавить, Выбрать, Удалить, обновить). По скольку для все сущностей один и тот же кейс, то не зачем писать однотипный код каждый раз - это будет раздражать.
Я не понимаю почему 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());
}
}