2017-02-26 36 views
8

W testach JUnit ze Spring MockMVC istnieją dwie metody uwierzytelniania jako użytkownik Spring Security: @WithMockUser tworzy fałszywego użytkownika z dostarczonymi poświadczeniami, @WithUserDetails przyjmuje nazwę użytkownika i rozwiązuje go we właściwej implementacji niestandardowej z niestandardowym UserDetailsService (UserDetailsServiceImpl).Spring Security, JUnit: @WithUserDetails dla użytkownika utworzonego w @Before

W moim przypadku UserDetailsService ładuje użytkownika z bazy danych. Użytkownik, którego chcę użyć, został wstawiony do metody testowej pakietu @Before.

Jednak mój UserDetailsServiceImpl nie znajduje użytkownika.

W moim @Before, wstawić użytkownikowi takiego:

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

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

Jak mogę korzystać z konta utworzonego w @Before z @WithUserDetails?

Odpowiedz

4

Niestety, nie można zrobić łatwo @WithUserDetails z @Before, ponieważ adnotacja Spring @WithUserDetails wywoła kontekstowy tester kontekstu ochrony Spring przed uruchomieniem metody setUp z @ Begore.

Oto https://stackoverflow.com/a/38282258/1814524 mały podstęp i odpowiedź na twoje pytanie.

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() { 

}