2017-02-26 18 views
8

Spring MockMVC ile JUnit testlerinde, Spring Security kullanıcısı olarak kimlik doğrulaması için iki yöntem vardır: @WithMockUser, sağlanan kimlik bilgileriyle kukla bir kullanıcı oluşturur, @WithUserDetails, bir kullanıcının adını alır ve özel bir UserDetailsService (UserDetailsServiceImpl) ile doğru özel UserDetails uygulamasına giderir.Spring Security, JUnit: @WithUserDetails, kullanıcı tarafından oluşturuldu @Before

Benim durumumda, UserDetailsService veritabanından bir kullanıcıyı yükler. Kullanmak istediğim kullanıcı, test paketinin @Before yöntemine eklenmiştir.

Ancak, UserDetailsServiceImpl benim kullanıcı bulamıyor. Benim @Before yılında

, böyle kullanıcıyı ekleyin:

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

Ve içinde

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

nasıl @WithUserDetails ile @Before oluşturulan bir hesap kullanabilir?

cevap

4

Maalesef @WithUserDetails annotation, @WithUserDetails annotation, @Before ile setUp yöntemini çalıştırmadan önce Spring güvenlik içeriği test dinleyicisini çağırması nedeniyle @BeforeUserDetails ile kolayca yapamazsınız.

Burada ufak bir ipucu ve sorunuza cevap vermeniz için 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() { 

} 
İlgili konular