首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟Spring安全单元测试WebTestClient

模拟Spring安全单元测试WebTestClient
EN

Stack Overflow用户
提问于 2022-06-30 06:18:29
回答 2查看 462关注 0票数 0

我正试图在我的web流量Spring引导应用程序中使用WebTestClient为Mycontroller编写单元测试用例。

它总是返回401,同时尝试执行我的单元测试用例。我已经经历了一些堆积如山的旧答案,但没有运气。

以下是我至今所遵循的方法:

使用@

  1. 禁用安全性(控制器= MyController.class,excludeAutoConfiguration ={ReactiveSecurityAutoConfiguration.class})

以上一个禁用的安全完美,但问题是,我得到java.security.Principal 在MyController和控制器抛出空指针异常,同时试图从主体.获取值。

  1. 在我的webTestClient测试中添加默认的承载令牌。在这种情况下,我将得到401.

  1. 在WebTestClient测试中添加了有效的承载令牌,我们通常使用它来访问API。在这种情况下,我也会得到401次未经授权的错误。

  1. 试图嘲弄主体对象,但没有成功。下面是我尝试过的代码:

身份验证= Mockito.mock(Authentication.class);SecurityContext securityContext = Mockito.mock(SecurityContext.class);Mockito.when(authentication.getPrincipal()).thenReturn(principal1);收集权限=新ArrayList<>();UsernamePasswordAuthenticationToken principal1 =新ArrayList<> "testPass");Mockito.when(authentication.getPrincipal()).thenReturn(principal1);

下面是MyController和MyControllerTest类供您参考:

  1. MyColroller.java

@GetMapping(produces = APPLICATION_JSON_VALUE,value = "/myController/{transactionId}") @运算( security = @SecurityRequirement(name = OAUTH2),responses ={ @ApiResponse(responseCode = "200“),content = @Content(mediaType =APPLICATION_JSON_VALUE),模式= @ schema (implementation =TransactionDocumentResponse.class) })公共ResponseEntity get( @PathVariable(value = "transactionId")字符串transactionId,主体主体){ Map userInfo = (Map) (验证)主体).getDetails();utility.checkForMissingToken(userInfo,xTestHeader);返回service.get(transactionId,userInfo);}

  1. MyControllerTest.java

@RunWith(SpringRunner.class) @WebFluxTest(controllers = {MyController.class}) @AutoConfigureWebTestClient @TestPropertySource( properties ={ " default - jwt -token = my default jwt令牌“,})公共类MyControllerTests {私有静态最终字符串testTransactionId = "abc_def";私有静态最终字符串testTransactionId= BigInteger.valueOf(123);@Value(”${default token}“)私有字符串jwtToken;@MockBean MyServiceImpl服务;@MockBean实用程序;@Autowired私有transactionDocumentResponse.setTransactionId(testTransactionIdBigInteger);WebTestClient webTestClient;@Test public void test_success() { TransactionDocumentResponse transactionDocumentResponse =新TransactionDocumentResponse();when(service.getRevolvingTransactions(anyString(),anyMap())).thenAnswer(createAnswer(response));WebTestClient.BodySpec stringBodySpec = webTestClient .method(HttpMethod.GET) .uri("/myController/{transactionId}",testTransactionId) .headers(h -> { h.setBearerAuth(jwtToken);) stringBodySpec.returnResult().getResponseBody().get("transactionId"));} .exchange() .expectBody(JSONObject.class);assertEquals(123,.expectBody } )

基本上,我需要一些机制来模拟Spring安全性,这样401错误就消失了,我在主体对象中得到了一些价值。

此外,我已经尝试了旧的解决方案,所以请不要标记它重复:)。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2022-06-30 06:41:20

请看这里:https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-method.html

@WithMockUser和相关的注释在这里可能很有用,您不需要做丑陋的模拟安全上下文的事情。

票数 0
EN

Stack Overflow用户

发布于 2022-07-15 05:25:57

我为我的单元测试用例创建了一个模拟Spring安全部分的自定义注释,因为我需要一些额外的字段,同时从控制器中的主体对象中获取值。

以下是代码:

  1. 创建一个名为WithMockCustomUser的注释

@RetentionPolicy.RUNTIME@WithSecurityContext(工厂= WithMockCustomUserSecurityContextFactory.class) public @interface WithMockCustomUser {} )

  1. 注释实现部分:

公共类UsernamePasswordAuthenticationToken(customUserDetails.getPrincipal(),WithMockCustomUserSecurityContextFactory实现了WithSecurityContextFactory {@覆盖公共SecurityContext createSecurityContext(WithMockCustomUser customUser) { SecurityContext context = SecurityContextHolder.createEmptyContext();customUserDetails CustomUserDetails = new CustomUserDetails();AbstractAuthenticationToken auth =新的WithMockCustomUserSecurityContextFactory customUserDetails.getCredentials(),customUserDetails.getAuthorities();auth.setDetails(customUserDetails.getDetails());context.setAuthentication(auth);返回上下文;}customUserDetails.getCredentials customUserDetails.getCredentials()

  1. 创建了覆盖身份验证类的CustomUserDetails类,该类还覆盖了授权的所有抽象方法,并提供了我的自定义实现:

公共类CustomUserDetails实现身份验证{//重写身份验证类方法,并返回一些裁剪值}

Hurray,现在我的自定义注释@MockWithCustomUser已经准备好与我的单元测试用例一起使用,如下所示:

代码语言:javascript
复制
@Test
@MockWithCustomUser
public void myTest() {
   //Unit test code
}

希望这有助于一些人通过自定义实现来模拟Spring安全:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72811094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档