Spring boot 从grpc测试类调用外部存根

Spring boot 从grpc测试类调用外部存根,spring-boot,junit,grpc-java,cucumber-junit,Spring Boot,Junit,Grpc Java,Cucumber Junit,我试图使用存根调用grpc服务(proto在不同的jar文件中)。但当我试图调用该服务时,我得到了由io.grpc.statusruntimeexception未实现方法未找到引起的。同样的方法在主类中运行良好,但在测试用例中不起作用 DeviceGroupServiceImplBase deviceService=Mockito.mock(DeviceGroupServiceImplBase.class, AdditionalAnswers.delegatesTo(新设备组ServiceImp

我试图使用存根调用grpc服务(proto在不同的jar文件中)。但当我试图调用该服务时,我得到了由io.grpc.statusruntimeexception未实现方法未找到引起的。同样的方法在主类中运行良好,但在测试用例中不起作用

DeviceGroupServiceImplBase deviceService=Mockito.mock(DeviceGroupServiceImplBase.class, AdditionalAnswers.delegatesTo(新设备组ServiceImplBase(){ }));


您需要实现
getDeviceGroupByDeviceUuid
,默认情况下它返回未实现状态。您可以验证它是否正在调用
ServerCall#asyncUnimplementedUneraryCall

DeviceGroupServiceImplBase deviceService = 
  Mockito.mock(
    DeviceGroupServiceImplBase.class, 
    AdditionalAnswers.delegatesTo(
      new DeviceGroupServiceImplBase() {
        @Override
        public void getDeviceGroupByDeviceUuid(
            DeviceUuid request, StreamObserver<DeviceGroup> responseObserver) {
          // TODO: implement
        } 
      }));
DeviceGroupServiceImplBase设备服务=
Mockito.mock(
DeviceGroupServiceImplBase.class,
AdditionalAnswers.delegatesTo(
新设备GroupServiceImplbase(){
@凌驾
公共无效getDeviceGroupByDeviceUuid(
DeviceUuid请求,StreamObserver响应(Observer){
//TODO:实现
} 
}));

这解决了问题,但为什么它再次调用方法中的实际存根,我是否也需要模拟它?
其他答案。delegates to
选项是使模拟调用成为传递对象的实际方法。如果您想在真实对象上使用verify,这将非常有用。如果这只是模拟,它可以工作,除非您需要手动绑定服务。(无论如何都应该避免模拟)//实际方法
public void getDevice(Device req,StreamObserver respObs){//一些代码逻辑设备组DeviceGroup=groupStub.getDeviceGroupByDeviceUuid(request);}
//测试用例
当(“用户调用getDevice”,()->{DeviceUuid request=DeviceUuid.newBuilder().setDeviceUuid(deviceUUID.build();groupData=mockGroupStub.getDeviceGroupByDeviceUuid(请求);responseObserver=StreamRecorder.create();//此行再次调用实际存根deviceService.getDevice(请求,responseObserver);responseObserver.awaitCompletion(5,TimeUnit.SECONDS);})
是io.grpc.testing.StreamRecorder吗?只看代码,它不应该调用存根。可能是下一行/上一行?它看起来确实在调用存根。如果是,你应该实现该方法。顺便说一句,你不应该阻止调用(最后一行).我已经实现了上面建议的测试方法,但实际的主存根位于服务器未启动的其他jar文件中。理想情况下,不应该调用实际存根,对吗?
DeviceGroupServiceImplBase deviceService = 
  Mockito.mock(
    DeviceGroupServiceImplBase.class, 
    AdditionalAnswers.delegatesTo(
      new DeviceGroupServiceImplBase() {
        @Override
        public void getDeviceGroupByDeviceUuid(
            DeviceUuid request, StreamObserver<DeviceGroup> responseObserver) {
          // TODO: implement
        } 
      }));