fNe*_*Nek 15 java junit spring spring-security mockmvc
在使用Spring MockMVC的JUnit测试中,有两种方法可以作为Spring Security用户进行身份验证:@WithMockUser使用提供的凭据创建虚拟用户,@WithUserDetails获取用户的名称并UserDetails使用自定义UserDetailsService(the UserDetailsServiceImpl)将其解析为正确的自定义实现.
在我的例子中,UserDetailsService从数据库加载用户.我想要使用的用户插入@Before了测试套件的方法中.
但是,我UserDetailsServiceImpl找不到用户.
在我@Before,我插入这样的用户:
User u = new User();
u.setEMail("test@test.de");
u = userRepository.save(u);
Run Code Online (Sandbox Code Playgroud)
并在UserDetailsServiceImpl:
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = this.userRepository.findOneByEMail(username);
if (user == null)
throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));
return user;
}
Run Code Online (Sandbox Code Playgroud)
如何使用创建的帐户@Before有@WithUserDetails?
setupBefore = TEST_EXECUTION这将有效地导致@WithUserDetails执行 after@Before和@BeforeEach
@BeforeEach
public void createUser() {
...
}
@Test
@WithUserDetails(value = "username", setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void expectToWork() {
...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,你不能轻易@WithUserDetails搞定@Before,因为Spring @WithUserDetails注释会在运行setUp方法之前调用Spring安全上下文测试监听器@Before.
这是/sf/answers/2679758091/一个小技巧并回答你的问题.
@Inject
private EntityManager em;
@Inject
PlatformTransactionManager txManager;
@BeforeTransaction
public void setup() {
new TransactionTemplate(txManager).execute(status -> {
User u = new User();
u.setEMail("test@test.de");
em.save(u);
return null;
});
}
@AfterTransaction
public void cleanup() {
new TransactionTemplate(txManager).execute(status -> {
// Check if the entity is managed by EntityManager.
// If not, make it managed with merge() and remove it.
em.remove(em.contains(u) ? user1 : em.merge(u));
return null;
});
}
@Test
@Transactional
@WithUserDetails(value = "test@test.de", userDetailsServiceBeanName = "loadUserByUsername")
public void test() {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4364 次 |
| 最近记录: |