Sping Boot 项目它使用SecurityContext。
它的大多数Rest控制器和服务都依赖于其登录用户的角色,用于验证目的。所以在测试过程中,我需要一个用户登录。
请告诉我单元测试代码的例子,为Spring Boot ,涉及登录用户的过程。
@RunWith(PowerMockRunner.class)
@PrepareForTest({SecurityContextHolder.class,AuthenticationManager.class,UserRepository.class,UserCreationRequestRepository.class, PasswordEncoder.class,AuthorityRepository.class,CacheManager.class,POMasterCompanyRepository.class,BranchRepository.class})
public class BOAuthControllerTest {
@Autowired
private WebApplicationContext context;
@Mock
private AuthenticationManager authenticationManager;
@Mock
private UserRepository userRepository;
@Mock
private UserCreationRequestRepository userCreationRequestRepository;
@Mock
private PasswordEncoder passwordEncoder;
@Mock
private AuthorityRepository authorityRepository;
@Mock
private CacheManager cacheManager;
@Mock
private POMasterCompanyRepository poMasterCompanyRepository;
@Mock
private BranchRepository branchRepository;
private UserService userService;
private MockMvc mockMvc;
@Before
public void setup() {
userService = new UserService(userRepository, passwordEncoder, authorityRepository, cacheManager, userCreationRequestRepository,
poMasterCompanyRepository,branchRepository);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken("admin","admin");
Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
SecurityContext securityContext = new SecurityContextImpl();
securityContext.setAuthentication(authentication);
System.out.println(authenticationToken==null?"null":"not null");
System.out.println(authenticationManager==null?"null":"not null");
System.out.println(authentication==null?"null":"not null");
System.out.println(SecurityContextHolder.getContext()==null?"null":"not null");
System.out.println(SecurityContextHolder.getContext().getAuthentication()==null?"null":"not null");
System.out.println(SecurityContextHolder.getContext().getAuthentication().getName());
System.out.println(securityContext.getAuthentication().getName());
PowerMockito.mockStatic(SecurityContextHolder.class);
when(SecurityContextHolder.getContext()).thenReturn(securityContext);
System.out.println(userService.getUserWithAuthorities().isPresent());
}
@Test
public void loginAvailableForAll() throws Exception {
System.out.println(userService.getUserWithAuthorities().isPresent());
}
}
2条答案
按热度按时间yrdbyhpb1#
而不是去
PowerMock
设置上下文由您自己。因为它是静态方法,所以可以在
@Before
方法中调用SecurityContextHolder.setContext(securityContext)
。示例:
2ledvvac2#
您可以使用PowerMock来模拟
SecurityContextHolder
。mockingSecurityContex
t返回所需角色列表的示例