У меня есть сущность, и я хотел бы реализовать Audit и AuditHistory, обе они работают, но во время модульного тестирования контекст приложения имеет значение null.
Сущность
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(UserListener.class)
public class User extends BaseModel<String> {
@Column
private String username;
@Column
private String password;
@Transient
private String passwordConfirm;
@ManyToMany
private Set<Role> roles;
}
UserListener
public class UserListener {
@PrePersist
public void prePersist(User target) {
perform(target, INSERTED);
}
@PreUpdate
public void preUpdate(User target) {
perform(target, UPDATED);
}
@PreRemove
public void preRemove(User target) {
perform(target, DELETED);
}
@Transactional(MANDATORY)
void perform(User target, Action action) {
EntityManager entityManager = BeanUtil.getBean(EntityManager.class);
if(target.isActive()){
entityManager.persist(new UserAuditHistory(target, action));
}else{
entityManager.persist(new UserAuditHistory(target, DELETED));
}
}
}
UserAuditHistory
@Entity
@EntityListeners(AuditingEntityListener.class)
public class UserAuditHistory {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_user_history"))
private User user;
@CreatedBy
private String modifiedBy;
@CreatedDate
@Temporal(TIMESTAMP)
private Date modifiedDate;
@Enumerated(STRING)
private Action action;
public UserAuditHistory() {
}
public UserAuditHistory(User user, Action action) {
this.user = user;
this.action = action;
}
}
BeanUtil для получения и настройки контекста
@Service
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
Теперь Junit, где я получаю исключение нулевого указателя на контекст из вышеупомянутого класса BeanUtil в методе getBean ().
@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest{
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository repository;
@Test
public void whenFindAll_theReturnListSize(){
entityManager.persist(new User("jk", "password", "password2", null));
assertEquals(repository.findAll().size(), 1);
}
}