我正试图在我的web流量Spring引导应用程序中使用WebTestClient为Mycontroller编写单元测试用例。
它总是返回401,同时尝试执行我的单元测试用例。我已经经历了一些堆积如山的旧答案,但没有运气。
以下是我至今所遵循的方法:
使用@
以上一个禁用的安全完美,但问题是,我得到java.security.Principal 空在MyController和控制器抛出空指针异常,同时试图从主体.获取值。
身份验证= 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类供您参考:
@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);}
@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错误就消失了,我在主体对象中得到了一些价值。
此外,我已经尝试了旧的解决方案,所以请不要标记它重复:)。
谢谢
发布于 2022-06-30 06:41:20
请看这里:https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-method.html
@WithMockUser和相关的注释在这里可能很有用,您不需要做丑陋的模拟安全上下文的事情。
发布于 2022-07-15 05:25:57
我为我的单元测试用例创建了一个模拟Spring安全部分的自定义注释,因为我需要一些额外的字段,同时从控制器中的主体对象中获取值。
以下是代码:
@RetentionPolicy.RUNTIME@WithSecurityContext(工厂= WithMockCustomUserSecurityContextFactory.class) public @interface WithMockCustomUser {} )
公共类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()
公共类CustomUserDetails实现身份验证{//重写身份验证类方法,并返回一些裁剪值}
Hurray,现在我的自定义注释@MockWithCustomUser已经准备好与我的单元测试用例一起使用,如下所示:
@Test
@MockWithCustomUser
public void myTest() {
//Unit test code
}希望这有助于一些人通过自定义实现来模拟Spring安全:)
https://stackoverflow.com/questions/72811094
复制相似问题