mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-10-31 22:58:58 +00:00 
			
		
		
		
	
		
			
	
	
		
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | === SecurityMockMvcResultHandlers | ||
|  | 
 | ||
|  | Spring Security provides a few ``ResultHandler``s implementations. | ||
|  | In order to use Spring Security's ``ResultHandler``s implementations ensure the following static import is used: | ||
|  | 
 | ||
|  | [source,java] | ||
|  | ---- | ||
|  | import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*; | ||
|  | ---- | ||
|  | 
 | ||
|  | ==== Exporting the SecurityContext | ||
|  | 
 | ||
|  | Often times we want to query a repository to see if some `MockMvc` request actually persisted in the database. | ||
|  | In some cases our repository query uses the xref:features/integrations/data.adoc[Spring Data Integration] to filter the results based on current user's username or any other property. | ||
|  | Let's see an example: | ||
|  | 
 | ||
|  | A repository interface: | ||
|  | [source,java] | ||
|  | ---- | ||
|  | private interface MessageRepository extends JpaRepository<Message, Long> { | ||
|  | 	@Query("SELECT m.content FROM Message m WHERE m.sentBy = ?#{ principal?.name }") | ||
|  | 	List<String> findAllUserMessages(); | ||
|  | } | ||
|  | ---- | ||
|  | 
 | ||
|  | Our test scenario: | ||
|  | 
 | ||
|  | [source,java] | ||
|  | ---- | ||
|  | mvc | ||
|  | 	.perform(post("/message") | ||
|  | 		.content("New Message") | ||
|  | 		.contentType(MediaType.TEXT_PLAIN) | ||
|  | 	) | ||
|  | 	.andExpect(status().isOk()); | ||
|  | 
 | ||
|  | List<String> userMessages = messageRepository.findAllUserMessages(); | ||
|  | assertThat(userMessages).hasSize(1); | ||
|  | ---- | ||
|  | 
 | ||
|  | This test won't pass because after our request finishes, the `SecurityContextHolder` will be cleared out by the filter chain. | ||
|  | We can then export the `TestSecurityContextHolder` to our `SecurityContextHolder` and use it as we want: | ||
|  | 
 | ||
|  | [source,java] | ||
|  | ---- | ||
|  | mvc | ||
|  | 	.perform(post("/message") | ||
|  | 		.content("New Message") | ||
|  | 		.contentType(MediaType.TEXT_PLAIN) | ||
|  | 	) | ||
|  | 	.andDo(exportTestSecurityContext()) | ||
|  | 	.andExpect(status().isOk()); | ||
|  | 
 | ||
|  | List<String> userMessages = messageRepository.findAllUserMessages(); | ||
|  | assertThat(userMessages).hasSize(1); | ||
|  | ---- | ||
|  | 
 | ||
|  | [NOTE] | ||
|  | ==== | ||
|  | Remember to clear the `SecurityContextHolder` between your tests, or it may leak amongst them | ||
|  | ==== |