我正在尝试测试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。
答案 0 :(得分:0)
您遇到什么错误?也许是因为它无法吸引用户。 您可以尝试:
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);