如何编写用于网关云过滤器的junit5测试以及如何获得此代码的完整代码覆盖率

如何解决如何编写用于网关云过滤器的junit5测试以及如何获得此代码的完整代码覆盖率

我想为网关云过滤器编写junit测试,但是问题是我是单元测试的新手。请帮我。这是一种私有的授权方法。

[如果没有人知道如何编写spring网关云过滤器,请通过我的网关过滤器方法进行操作。和逻辑]

@Component
@Slf4j
public class AuthorizationFilter extends AbstractGatewayFilterFactory<AuthorizationFilter.Config> {

    @Value("${rest.auth.service.url}")
    private String authServiceUrl;

    @Autowired
    RestTemplate restTemplate;

    public AuthorizationFilter() {
        super(Config.class);
    }

    private Mono<Void> onError(ServerWebExchange exchange,String err,HttpStatus httpStatus) {
        ServerHttpResponse response = exchange.getResponse();
        response.setStatusCode(httpStatus);

        return response.setComplete();
    }
    //Here is my authorization details 
    private UserRoleDetailsDTO getAuthorizationDetails(String authorizationHeader) {
        try {
            log.error("Checking authorization");
            HttpEntity<?> entity = new HttpEntity(null,new HttpHeaders() {{
                add("Authorization",authorizationHeader);
                add("Accept","application/json");
            }});

            ResponseEntity<Map> responseMap = restTemplate.exchange(authServiceUrl.concat("/v1/profile"),HttpMethod.GET,entity,Map.class);
            System.out.println(responseMap);
            if (responseMap.getBody() == null)
                log.warn("Received null body in response. Request will end now");
            Map data = (Map) responseMap.getBody().get("data");
            boolean isAuthorized = data.get("authorized") == null || (boolean) data.get("authorized");
            UserRoleDetailsDTO userRoleDetailsDTO = UserRoleDetailsDTO.builder().userId(String.valueOf(data.get("userId"))).
                    roles((List<RoleDTO>) data.get("roles")).isAuthorized(isAuthorized).build();
            return userRoleDetailsDTO;
        } catch (RestClientException e) {
            String errorResponse = null;
            if (e instanceof HttpClientErrorException) {
                HttpClientErrorException exception = (HttpClientErrorException) e;
                errorResponse = exception.getResponseBodyAsString();
            } else errorResponse = e.getMessage();
            log.error("error with http connect with error response : {} : {}",errorResponse,e);
            return null;
        } catch (Exception e) {
            log.error("error with http connect : {}",e);
            return null;
        }
    }
    // Here is my Gateway filter
    @Override
    public GatewayFilter apply(Config config) {

        return (exchange,chain) -> {
            ServerHttpRequest request = exchange.getRequest();

            String requestId;
            if (request.getHeaders().containsKey("Request-Id")) {
                requestId = request.getHeaders().get("Request-Id").get(0);
            } else {
                requestId = UUID.randomUUID().toString();
                log.debug("Request Id not passed. {} is genertaing requestId {}",AuthorizationFilter.class.getSimpleName(),requestId);
            }
            MDC.put("requestId",requestId);
            request.mutate().header("Request-Id",requestId);

            if (!request.getHeaders().containsKey("Authorization")) {
                log.error("No authorization header");
                return onError(exchange,"No Authorization header",HttpStatus.UNAUTHORIZED);
            }

            String authorizationHeader = request.getHeaders().get("Authorization").get(0);

            UserRoleDetailsDTO userRoleDetailsDTO = getAuthorizationDetails(authorizationHeader);
            if (userRoleDetailsDTO == null || !userRoleDetailsDTO.isAuthorized()) {
                log.error("Invalid authorization header");
                return onError(exchange,"Invalid Authorization header",HttpStatus.UNAUTHORIZED);
            }
            String userDetailsStr = "";
            try {
                userDetailsStr = new ObjectMapper().writeValueAsString(userRoleDetailsDTO);
                System.out.println("value 1 :"+userDetailsStr);
            } catch (JsonProcessingException e) {
                log.error("Exception writing user details to string. ",e);
            }
            if (StringUtils.isEmpty(userDetailsStr))
                log.warn("Empty User Details string being passed!!");
            request.mutate().header(ApplicationConstants.USER_DETAILS_HEADER,userDetailsStr);
            System.out.println("value 2 :"+request.mutate().header(ApplicationConstants.USER_DETAILS_HEADER,userDetailsStr));
            return chain.filter(exchange.mutate().request(request).build());
        };

    }

    @Override
    public Config newConfig() {
        return new Config();
    }

    public static class Config {
        // Put the configuration properties
    }

}

这是我的用户角色详细信息

public class UserRoleDetailsDTO {
    private String userId;
    private List<RoleDTO> roles;
    private boolean isAuthorized = true;
} 

和RoleDto类

  public class RoleDTO {
        private String name;
        private int weight;
    }

这是我在进行代码覆盖率测试时进行的junit测试,但是我没有完全覆盖代码,请帮忙

 public YourClassTest{   

    @Test
    void apply() throws Exception {
        AuthorizationFilter authorizationFilter  = new AuthorizationFilter();
        AuthorizationFilter.Config config = new YourClass.Config();
        GatewayFilter filter =authorizationFilter.apply(config);
        String st ;
        st = new  ObjectMapper().writeValueAsString(userRoleDetailsDTO);
             MockServerHttpRequest expected  = MockServerHttpRequest.get("/v1/profile").
               header("Authorization","Bearer sdfsf",st,TestConstants.USER_DETAILS_HEADER).build();
        MockServerWebExchange exchange = MockServerWebExchange.from(expected);
        filter.filter(exchange,FilterChain);
        String requestid;
        ServerHttpRequest actual =  exchange.getRequest();
        assertEquals(expected,actual);
    }
 }

解决方法

我等了两天,有人会回答我的问题,但没人回答我的问题,但最终我解决了。我用过junit5

这是我正确的解决方法

@SpringBootTest(properties = { "spring.profiles.active=test" })
class AuthorizationFilterTest {

    @Mock
    GatewayFilterChain filterChain;
    @MockBean()
    RestTemplate restTemplate;
    @Autowired
    AuthorizationFilter authorizationFilter = new AuthorizationFilter();
    
    @BeforeAll
    public static void init() {
    userRoleDetailsDTO = new UserRoleDetailsDTO();
    RoleDTO roleDTO = new RoleDTO();
    roleDTO.setName("ADMIN_ROLE");
    roleDTO.setWeight(1);
    userRoleDetailsDTO.setUserId("user::2f840056-e7aa-84m- 68e1-1e2ef697c78b");
    userRoleDetailsDTO.setRoles(Stream.of(roleDTO).collect(Collectors.toList()));

}


    @Test
    void apply()
    {
     AuthorizationFilter.Config config = new AuthorizationFilter.Config();
    Map<String,Object> profile = objectMapper.readValue(TestConstantsTest.ADMIN_PROFILE_RESPONSE,Map.class);
    ResponseEntity<Map> profileMap = ResponseEntity.ok(profile);
    Mockito.when(restTemplate.exchange(Mockito.anyString(),Mockito.any(HttpMethod.class),Mockito.any(HttpEntity.class),Mockito.eq(Map.class))).thenReturn(profileMap);
    GatewayFilter filter = authorizationFilter.apply(config);
    MockServerHttpRequest expected = MockServerHttpRequest.post("/v1/profile")
            .header("Authorization",TestConstantsTest.ADMIN_INITIALISE_REQUEST_AUTH_HEADER).build();
    MockServerWebExchange exchange = MockServerWebExchange.from(expected);
    filter.filter(exchange,GatewayfilterChain);
    ServerHttpRequest actual = exchange.getRequest();
    assertEquals(expected,actual);
   
    }

这是我的TestConstant.class

    Class TestConstantTest
    {
         public static final String ADMIN_PROFILE_RESPONSE = "{\n" +
                "   \"code\":\"200\",\n" +
                "   \"data\":{\n" +
                "      \"myroles\":[\n" +
                "         {\n" +
                "            \"name\":\"ADMIN_ROLE\",\n" +
                "            \"weight\":\"1\"\n" +
                "         }\n" +
                "      ],\n" +
                "      \"userId=User\":\"manually-inserted-usser-user-id-normallt-uuid\"\n" +
                "   },\n" +
                "   \"message\":\"Success\",\n" +
                "   \"status\":1\n" +
                " }";
    
        public static final String ADMIN_INITIALISE_REQUEST_AUTH_HEADER ="Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX" +
                "VCJ9.eyJhdWQiOlsicmVzb3VyY2Utc2VydmVghingbshtYXBpIl0sImV4cCI6MTU5NTI0NDU2MywidXNlcl9uYW1lIj" +
                "oiYzNlMjk0MGEtYzM3ZS0xMWVhLTg3ZDAtMDI0MmFjMTMwMDAzIiwianRpIjoiZTNkZDA1MTEtNDM0NC00MjhiLTk2Z" +
                "WQtYjUzNzU3Y2uytrewqasdY2xpZW50X2lkIjoic3ByaW5nLXNlY3VyaXR5LW9hdXRoMi1yZWFkLXdyaXRlLWNsa" +
                "WVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdfQ.HvbThWCTqs2y9dP87kE31PmPA-EFk3J6HDFyAiEQlsM";
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-