Ложный контекст безопасности для теста интеграции JPA - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь протестировать пружинный интерфейс репозитория 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 по отдельной причине.

1 Ответ

0 голосов
/ 21 декабря 2018

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...