AuditEntityListener junit не может найти контекст - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть сущность, и я хотел бы реализовать 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вот как я решил проблему, в классе теста

@ Autowired ApplicationContext context;

внутри метода теста с именем

BeanUtil beanUtil = new BeanUtil();
beanUtil.setApplicationContext(context);

, и это сработало.

0 голосов
/ 27 февраля 2019

Проблема в том, что вы используете не AOP Spring, а статический контекст:

private static ApplicationContext context;

Это ноль, потому что не создание @Bean приводит к незафиксированным объектам.Решение было бы @Autowire это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...