【发布时间】:2020-01-17 08:54:24
【问题描述】:
在 REST 控制器中,我有几种方法需要创建合同测试,但我不知道如何提供 Principal 以通过测试。
Controller 中的一种方法,其参数为 Principal:
@PreAuthorize("hasRole('USER')")
@GetMapping("/current")
public Details getCurrent(Principal principal) {
return houseManager.getById(Principals.getCurrentUserId(principal));
}
我已经为测试创建了基类:
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = {Controller.class})
@ContextConfiguration(classes = {TestConfig.class, ControllerTestConfig.class})
@ComponentScan(basePackageClasses = {Controller.class})
@AutoConfigureStubRunner
public class ControllersWithSecurityBase {
@Autowired
privet Service service;
@Autowired
WebApplicationContext context;
@Mock
private Principal mockedPrincipal;
RestAssuredMockMvc.standaloneSetup(new Controller(service));
RequestBuilder requestBuilder = MockMvcRequestBuilders
.get("/")
.with(user("user")
.password("password")
.roles("USER"))
.principal(mockedPrincipal)
.accept(MediaType.APPLICATION_JSON);
MockMvc mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.defaultRequest(requestBuilder)
.apply(springSecurity())
.build();
RestAssuredMockMvc.mockMvc(mockMvc);
}
合同:
Contract.make {
name("Should find current by principal")
request {
method(GET)
urlPath(".../current")
}
response {
status(200)
}
}
由于 mvn clean install 我有下一个异常:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.security.authentication.UsernamePasswordAuthenticationToken cannot be cast to java.util.Map
我需要做什么才能正确地模拟 Principal 并通过测试?
【问题讨论】:
-
@WithMockUser(...) -
Zorglube,你能不能更深入地解释一下?因为我已经尝试将它注释为:@WithMockUser(username = "user", roles = "USER") 以上 setUp 方法和以上类 - 结果它仍然无法正常工作。
-
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = Application.class) @AutoConfigureMockMvc @Transactional @RunWith(value = SpringRunner.class) public class Tests { @Test @WithMockUser(username = "user_test", authorities = "ROLE_USER") public void test() { ... } }
标签: spring-mvc spring-security spring-cloud