2626import static org .junit .Assert .assertThrows ;
2727import static org .junit .Assert .assertTrue ;
2828import static org .junit .Assert .fail ;
29- import static org .mockito .ArgumentMatchers .any ;
3029import static org .mockito .Mockito .doReturn ;
3130import static org .mockito .Mockito .mock ;
3231import static org .mockito .Mockito .verify ;
5251import io .grpc .MetricSink ;
5352import io .grpc .NameResolver ;
5453import io .grpc .NameResolverRegistry ;
54+ import io .grpc .NoopMetricSink ;
5555import io .grpc .StaticTestingClassLoader ;
56+ import io .grpc .Uri ;
5657import io .grpc .internal .ManagedChannelImplBuilder .ChannelBuilderDefaultPortProvider ;
5758import io .grpc .internal .ManagedChannelImplBuilder .ClientTransportFactoryBuilder ;
5859import io .grpc .internal .ManagedChannelImplBuilder .FixedPortProvider ;
7778import org .junit .runners .Parameterized ;
7879import org .junit .runners .Parameterized .Parameter ;
7980import org .junit .runners .Parameterized .Parameters ;
80- import org .mockito .ArgumentCaptor ;
8181import org .mockito .Mock ;
8282import org .mockito .junit .MockitoJUnit ;
8383import org .mockito .junit .MockitoRule ;
@@ -786,7 +786,7 @@ public void setNameResolverExtArgs() {
786786
787787 @ Test
788788 public void childChannelConfigurator_setsField () {
789- ChannelConfigurator configurator = mock ( ChannelConfigurator . class ) ;
789+ ChannelConfigurator configurator = new ChannelConfigurator () {} ;
790790 assertSame (builder , builder .childChannelConfigurator (configurator ));
791791 assertSame (configurator , builder .channelConfigurator );
792792 }
@@ -801,8 +801,14 @@ public void childChannelConfigurator_propagatesMetricsAndInterceptors_xdsTarget(
801801 when (mockClientTransportFactory .getSupportedSocketAddressTypes ())
802802 .thenReturn (Collections .singleton (InetSocketAddress .class ));
803803
804- MetricSink mockMetricSink = mock (MetricSink .class );
805- ClientInterceptor mockInterceptor = mock (ClientInterceptor .class );
804+ MetricSink mockMetricSink = new NoopMetricSink ();
805+ ClientInterceptor mockInterceptor = new ClientInterceptor () {
806+ @ Override
807+ public <ReqT , RespT > ClientCall <ReqT , RespT > interceptCall (
808+ MethodDescriptor <ReqT , RespT > method , CallOptions callOptions , Channel next ) {
809+ return next .newCall (method , callOptions );
810+ }
811+ };
806812
807813 // Define the Configurator
808814 ChannelConfigurator configurator = new ChannelConfigurator () {
@@ -814,23 +820,47 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
814820 }
815821 };
816822
817- // Mock NameResolver.Factory to capture Args
818- NameResolver .Factory mockNameResolverFactory = mock (NameResolver .Factory .class );
819- when (mockNameResolverFactory .getDefaultScheme ()).thenReturn ("xds" );
820- NameResolver mockNameResolver = mock (NameResolver .class );
821- when (mockNameResolver .getServiceAuthority ()).thenReturn ("foo.authority" );
822- ArgumentCaptor <NameResolver .Args > argsCaptor = ArgumentCaptor .forClass (NameResolver .Args .class );
823- if (enableRfc3986UrisParam ) {
824- when (mockNameResolverFactory .newNameResolver ((io .grpc .Uri ) any (),
825- argsCaptor .capture ())).thenReturn (mockNameResolver );
826- } else {
827- when (mockNameResolverFactory .newNameResolver ((URI ) any (),
828- argsCaptor .capture ())).thenReturn (mockNameResolver );
829- }
823+ // Use NameResolver.Factory to capture Args
824+ final NameResolver .Args [] capturedArgs = new NameResolver .Args [1 ];
825+ final boolean [] newNameResolverCalled = new boolean [1 ];
826+
827+ NameResolver realNameResolver = new NameResolver () {
828+ @ Override
829+ public String getServiceAuthority () {
830+ return "foo.authority" ;
831+ }
830832
831- // Use the configurator and the mock factory
833+ @ Override
834+ public void start (Listener2 listener ) {}
835+
836+ @ Override
837+ public void shutdown () {}
838+ };
839+
840+ NameResolver .Factory realNameResolverFactory = new NameResolver .Factory () {
841+ @ Override
842+ public NameResolver newNameResolver (URI targetUri , NameResolver .Args args ) {
843+ newNameResolverCalled [0 ] = true ;
844+ capturedArgs [0 ] = args ;
845+ return realNameResolver ;
846+ }
847+
848+ @ Override
849+ public NameResolver newNameResolver (Uri targetUri , NameResolver .Args args ) {
850+ newNameResolverCalled [0 ] = true ;
851+ capturedArgs [0 ] = args ;
852+ return realNameResolver ;
853+ }
854+
855+ @ Override
856+ public String getDefaultScheme () {
857+ return "xds" ;
858+ }
859+ };
860+
861+ // Use the configurator and the custom factory
832862 NameResolverRegistry registry = new NameResolverRegistry ();
833- registry .register (new NameResolverFactoryToProviderFacade (mockNameResolverFactory ));
863+ registry .register (new NameResolverFactoryToProviderFacade (realNameResolverFactory ));
834864
835865 ManagedChannelBuilder <?> parentBuilder = new ManagedChannelImplBuilder (
836866 "xds:///my-service-target" ,
@@ -843,28 +873,25 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
843873 grpcCleanupRule .register (channel );
844874
845875 // Verify that newNameResolver was called
846- if (enableRfc3986UrisParam ) {
847- verify (mockNameResolverFactory ).newNameResolver ((io .grpc .Uri ) any (), any ());
848- } else {
849- verify (mockNameResolverFactory ).newNameResolver ((URI ) any (), any ());
850- }
876+ assertThat (newNameResolverCalled [0 ]).isTrue ();
851877
852878 // Extract the childChannelConfigurator from Args
853- NameResolver .Args args = argsCaptor . getValue () ;
879+ NameResolver .Args args = capturedArgs [ 0 ] ;
854880 ChannelConfigurator channelConfiguratorInArgs = args .getChildChannelConfigurator ();
855881 assertNotNull ("Child channel configurator should be present in NameResolver.Args" ,
856882 channelConfiguratorInArgs );
857883
858884 // Verify the configurator is the one we passed
859885 assertThat (channelConfiguratorInArgs ).isSameInstanceAs (configurator );
860886
861- // Verify the configurator logically applies (by running it on a mock)
862- ManagedChannelBuilder <?> mockChildBuilder = mock (ManagedChannelBuilder .class );
863- // Stub addMetricSink to return the builder to avoid generic return type issues
864- doReturn (mockChildBuilder ).when (mockChildBuilder ).addMetricSink (any ());
887+ // Verify the configurator logically applies (by running it on a real builder)
888+ ManagedChannelImplBuilder childBuilder = new ManagedChannelImplBuilder (
889+ "xds:///child-service-target" ,
890+ mockClientTransportFactoryBuilder ,
891+ new FixedPortProvider (DUMMY_PORT ));
865892
866- configurator .configureChannelBuilder (mockChildBuilder );
867- verify ( mockChildBuilder ). addMetricSink (mockMetricSink );
893+ configurator .configureChannelBuilder (childBuilder );
894+ assertThat ( childBuilder . metricSinks ). contains (mockMetricSink );
868895 }
869896
870897 @ Test
0 commit comments