【问题标题】:How to test and mock a GRPC service written in Java using Mockito如何使用 Mockito 测试和模拟用 Java 编写的 GRPC 服务
【发布时间】:2018-04-17 07:13:19
【问题描述】:

protobuf定义如下:

syntax = "proto3";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

我需要将 Mockito 与 JUnit 测试一起使用。

【问题讨论】:

    标签: java junit mockito grpc


    【解决方案1】:

    鼓励的测试服务的方法是使用进程内传输和普通存根。然后,您可以像平常一样与服务进行通信,而无需进行大量嘲笑。过度使用的模拟会产生脆弱的测试,不会给被测试的代码灌输信心。

    GrpcServerRule 在幕后使用进程内传输。我们现在建议看一下示例的测试,从 hello world 开始。

    编辑:我们现在推荐GrpcCleanupRule 而不是GrpcServerRule。您仍然可以参考 hello world 示例。

    【讨论】:

    • 我按照 Selvaram 的建议进行了测试,在阅读了 Eric 的评论后,我认为这是相关的,但如果我使用“进程内传输和普通存根”,我不会做不知何故集成测试?在与推荐测试相同的级别上,还有另一个测试,如建议的 Selvram。 github.com/grpc/grpc-java/blob/master/examples/src/test/java/io/…
    • testing.googleblog.com/2013/05/…。 grpc-java 鼓励使用进程内传输的原因是为了避免“测试不能保证您的代码正常工作”。在 gRPC 的早期,用户使用的是 mock,测试没有提供真正的价值,却导致了不可能的情况;它们纯粹是有害的。进程内传输提供了模拟的大部分优点而没有缺点,包括能够在单个线程上确定性地执行测试。
    【解决方案2】:

    这个想法是存根响应和流观察器。

    @Test
    public void shouldTestGreeterService() throws Exception {
    
        Greeter service = new Greeter();
    
        HelloRequest req = HelloRequest.newBuilder()
                .setName("hello")
                .build();
    
        StreamObserver<HelloRequest> observer = mock(StreamObserver.class);
    
        service.sayHello(req, observer);
    
        verify(observer, times(1)).onCompleted();
    
        ArgumentCaptor<HelloReply> captor = ArgumentCaptor.forClass(HelloReply.class);
    
        verify(observer, times(1)).onNext(captor.capture());
    
        HelloReply response = captor.getValue();
    
        assertThat(response.getStatus(), is(true));
    }
    

    【讨论】:

    • 感谢@Selvaram。这有很大帮助。只有我必须编辑 StreamObserver observer = mock(StreamObserver.class); 因为我已经定义了这样的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多