在REST控制器中,我有几个方法需要创建契约测试,但我不知道如何提供Principal来通过测试。
控制器中的方法之一,其参数中包含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干净安装的结果,我有下一个异常:
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
我需要做什么才能正确地嘲笑校长并通过考试?
3条答案
按热度按时间ssm49v7z1#
当您设置基类并确信需要使用AuthenticationPrincipalArgumentResolver传递自定义参数解析器时
您还可以传入插件,该插件将在每个测试中添加WithMockUser
记住将WithMockUser作为完全限定名传递。
nwlls2ji2#
我的项目使用Oauth2安全性。
因此,为了在契约测试中模拟Principal对象,我创建了OAuth2AuthenticationDetails的bean(该类实现了Principal接口)。
具有Bean OAuth2AuthenticationDetails的类配置为:
因此,我的合同测试基类是:
klsxnrf13#
在基本测试中添加
@WithMockUser
对我很有效。