我有一个Spring Boot 2 Web服务。它接受Bearer令牌,并使用Spring OAuth2转到外部URL,并使用该令牌获取用户详细信息。我正在尝试创建测试Web服务实现的测试,但是我正在努力找出如何从测试中传递AuthenticationPrinicple?
这是我的控制器中方法的一个示例;
@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity listUserUploadedFiles(@AuthenticationPrincipal Client client) {
FileListResponse rsp = new FileListResponse(fileStorageService.getUserFiles(client.getUid()));
return rsp.response(HttpStatus.OK);
}
到目前为止,这是我的测试;
@Test
public void TestSimple() throws Exception {
mockMvc.perform(get("/file"))
.andExpect(status().isOk());
}
当前测试失败,因为客户端(AuthenticationPrinicple)为空。
我该怎么做?
----更新----
这是我的Client对象,如您所见,它不继承UserDetails。
public class Client implements Serializable {
private static final long serialVersionUID = 1L;
private String uid;
private String email;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
还有一个PrincipalExtractor bean安装程序。
@Bean
public PrincipalExtractor principalExtractor() {
return map -> {
Client client = new Client();
client.setUid(String.valueOf(map.get("uid")));
client.setEmail(String.valueOf(map.get("name")));
return client;
};
}
提供有关该项目的更多信息。这是一个微服务,用户通过Web服务在该服务的外部进行身份验证。对该服务器进行调用时,将提供一个令牌,该令牌将通过身份验证服务器(再次是外部)进行验证。身份验证服务器的响应为我们提供了一个uuid和一个电子邮件字段,PrincipalExtractor将它们映射到一个Client对象,然后将其传递到要使用的控制器中。
答案 0 :(得分:1)
您可以在测试@WithMockUser
时嘲笑您的用户。
如果使用MockMvc,则不需要额外的sec配置
@RunWith(SpringRunner.class)
@WebMvcTest(SecuredController.class)
public class SecuredControllerWebMvcIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(value = "user")
public void testSimple() throws Exception {
mockMvc.perform(get("/file"))
...
如果您想在@WithMockUser
中使用@SpringBootTest
,则需要进行额外的配置
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class SecuredControllerSpringBootIntegrationTest
...
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
...