public Result invoke()

in dubbo-mock-extensions/dubbo-mock-admin/src/main/java/org/apache/dubbo/mock/filter/AdminMockFilter.java [129:167]


    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        // check if open the admin mock config, global config.
        if (!ENABLE_ADMIN_MOCK) {
            return invoker.invoke(invocation);
        }

        String interfaceName = invocation.getTargetServiceUniqueName();
        String methodName = invocation.getMethodName();
        Object[] params = solveParams(invocation.getArguments());

        // check if the MockService's invoker, then request.
        if (Objects.equals(interfaceName, MockService.class.getName())) {
            return invoker.invoke(invocation);
        }
        MockService mockService = getMockService();
        if (Objects.isNull(mockService)) {
            log.warn("[Admin Mock] cloud not find MockService, will ignore this mock.");
            return invoker.invoke(invocation);
        }

        // parse the result from MockService, build the real method's return value.
        MockContext mockContext = MockContext.newMockContext()
            .serviceName(interfaceName).methodName(methodName).arguments(params).build();
        MockResult mockResult = mockService.mock(mockContext);
        if (!mockResult.getEnable()) {
            return invoker.invoke(invocation);
        }

        // parse the return data.
        Class<?> returnType = ((RpcInvocation) invocation).getReturnType();
        ResultContext resultContext = ResultContext.newResultContext()
            .data(mockResult.getContent()).targetType(returnType)
            .serviceName(interfaceName).methodName(methodName).build();
        Object data = typeHandler.handleResult(resultContext);
        AppResponse appResponse = new AppResponse(data);
        CompletableFuture<AppResponse> appResponseFuture = new CompletableFuture<>();
        appResponseFuture.complete(appResponse);
        return new AsyncRpcResult(appResponseFuture, invocation);
    }