Имитация контекста безопасности для интеграционного теста JPA

Я пытаюсь протестировать интерфейс репозитория Spring JPA, чтобы убедиться, что мои сопоставления верны. Моя сущность расширяет базовую сущность, помеченную ..

@EntityListeners(BaseEntityEventListener.class)
@MappedSuperclass
public abstract class BaseEntity {...

Слушатель событий заполняет некоторые свойства аудита.

public class BaseEntityEventListener {
    @PrePersist
    public void onPreInsert(BaseEntity baseEntity){
        MyUserPrincipal principal = (MyUserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = principal.getUsername();
        baseEntity.setCreationUser(username);
        Timestamp ts = new Timestamp(System.currentTimeMillis());
        baseEntity.setCreationDate(ts);
    }...

Это нормально, но когда я хочу протестировать репозиторий, я получаю нулевой указатель на SecurityContextHolder.

@RunWith(SpringRunner.class)
@SpringBootTest
public class RepositoryTest {
    @Autowired private MyRepository myRepo;

    @Test
    public void testSaveEntity() throws Exception {
        Entity entity = new Entity(TEST_ID);
        myRepo.save(entity);
    }...

Когда класс прослушивателя событий вызывается из теста, контекст безопасности не устанавливается. Я пробовал использовать @WithMockUser, но, похоже, это не сработало. Могу ли я обернуть вызов контекста безопасности в службе, а затем как-то имитировать этот вызов в моем интеграционном тесте. Как установить имитацию прослушивателя сущностей, если это вариант. Когда я использую @CreatedBy и @CreatedDate, контекст безопасности не является проблемой, но мне нужно вручную использовать @PreInsert по отдельной причине.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Какая у вас ошибка? Может потому, что не может достать пользователя. Можешь попробовать:

val userPrincipal =
                new org.springframework.security.core.userdetails.User(username,
                        "",
                        true,
                        true,
                        true,
                        true,
                        authorities);
        val auth = new TestingAuthenticationToken(userPrincipal, null, authorities);
        auth.setAuthenticated(true);
        SecurityContextHolder.getContext().setAuthentication(auth);

Другие вопросы по теме