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




Какая у вас ошибка? Может потому, что не может достать пользователя. Можешь попробовать:
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);