Im Spring-Security-Unit-Test gab es eine Stelle, an der die Controller-Methode "Authentication # getDetails" lautete (siehe unten), und dies wurde zu "NullPointerException".
SampleDetails details = (SampleDetails)auth.getDetails();
details.getHoge();
Es schien keine Möglichkeit zu geben, dies für WithMockUser festzulegen, daher dachte ich über einen anderen Weg nach.
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>
Unten ist der Testcode.
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());
}
}
Nun, ich bin sicher, ich werde es mit der Überzeugung besetzen, dass "UsernamePasswordAuthenticationToken" verwendet wird, und in "setDetails" werde ich die entsprechenden Werte zum Testen eingeben. Ich habe mich mit dieser Methode befasst.
Recommended Posts