2017-02-26 121 views
8

建立在JUnit測試與Spring MockMVC,有兩種方法用於驗證爲一個Spring Security用戶用戶:@WithMockUser創建具有提供的憑據的虛擬用戶,@WithUserDetails需要一個用戶名並使用自定義的UserDetailsServiceUserDetailsServiceImpl)將其解析爲正確的自定義UserDetails實現。春季安全,JUnit的:@WithUserDetails在@Before

在我的情況下,UserDetailsService從數據庫加載用戶。我想要使​​用的用戶被插入到測試套件的@Before方法中。

但是,我的UserDetailsServiceImpl找不到用戶。

在我@Before,我插入這樣的用戶:

User u = new User(); 
u.setEMail("[email protected]"); 
u = userRepository.save(u); 

而在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; 
} 

我如何使用@Before@WithUserDetails創建一個帳戶?

回答

4

不幸的是,您無法使用@Before輕鬆執行@WithUserDetails,因爲在@Before運行setUp方法之前,Spring @WithUserDetails批註將調用Spring安全上下文測試監聽器。

這裏是https://stackoverflow.com/a/38282258/1814524一個小技巧和答案你的問題。

3
@Inject 
private EntityManager em; 

@Inject 
PlatformTransactionManager txManager; 

@BeforeTransaction 
public void setup() { 
    new TransactionTemplate(txManager).execute(status -> { 

     User u = new User(); 
     u.setEMail("[email protected]"); 
     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 = "[email protected]", userDetailsServiceBeanName = "loadUserByUsername") 
public void test() { 

}