public static <T, R> R unaryCall(Invoker<?> invoker, MethodDescriptor methodDescriptor, T request) {
        return (R) call(invoker, methodDescriptor, new Object[] {request});
    }
@Test
    void testUnaryCall() throws Throwable {
        when(invoker.invoke(any(Invocation.class))).then(invocationOnMock -> result);
        CountDownLatch latch = new CountDownLatch(1);
        AtomicReference<Object> atomicReference = new AtomicReference<>();
        StreamObserver<Object> responseObserver = new StreamObserver<Object>() {
            @Override
            public void onNext(Object data) {
                atomicReference.set(data);
            }

            @Override
            public void onError(Throwable throwable) {}

            @Override
            public void onCompleted() {
                latch.countDown();
            }
        };
        StubInvocationUtil.unaryCall(invoker, method, request, responseObserver);
        latch.await(1, TimeUnit.SECONDS);
        Assertions.assertEquals(response, atomicReference.get());
    }