[JAVA] Correspondance de la partie où l'authentification # getDetails est effectuée dans le test unitaire de spring-security

Contexte

Dans le test unitaire de Spring-Security, il y avait un endroit où la méthode du contrôleur était Authentication # getDetails``` comme indiqué ci-dessous, et cela est devenu NullPointerException```.

SampleDetails details = (SampleDetails)auth.getDetails();
details.getHoge();

Il ne semblait y avoir aucun moyen de définir cela pour WithMockUser, alors j'ai pensé à une autre façon.

Faire face

pom.xml


	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
	</parent>

	<properties>
		<java.version>10.0</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>

Voici le code de test.

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import kagamihoge.springmvcsample.controller.SampleDetails;


@RunWith(SpringRunner.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = App.class)
@AutoConfigureMockMvc
public class SecurityTest {
    @Autowired
    private MockMvc mvc;

    @Test
    @WithMockUser
    public void whenGetCustomers_thenStatus200() throws Exception {
        UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
        auth.setDetails(new SampleDetails());
        
        mvc.perform(get("/hoge"))
                .andExpect(status().isOk());
    }
}

Eh bien, je crois que UsernamePasswordAuthenticationToken sera définitivement utilisé et casté, et dans setDetails``` j'ai mis une valeur appropriée pour les tests. J'ai traité de cette méthode.

Recommended Posts

Correspondance de la partie où l'authentification # getDetails est effectuée dans le test unitaire de spring-security
Dans spring-security, l'URL de redirection de mon écran de connexion est incorrecte et la connexion échoue.
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
Dans Time.strptime,% j (date totale de l'année) est
Obtenez le nom du scénario de test dans la classe de test JUnit
A été effectué dans l'année de base de la semaine calendaire Java
Quelle est la représentation de la connaissance du domaine dans le modèle [DDD]?
[Rails] Où faire attention dans la description de la validation
Authentification 802.1X au réseau du paramètre de liaison dans CentOS7
[Android] Essayez celui qui affiche l'effet sur la partie touchée de l'écran qui est courant dans les jeux