From d8d2e5a7cbb7b2d188a23ec096d5026fdc024ea0 Mon Sep 17 00:00:00 2001 From: jdcormie Date: Mon, 12 Oct 2026 14:34:16 -0700 Subject: [PATCH] binder: Don't mock ServerCall in test io.grpc.ServerCall is documented as DO NOT MOCK. --- .../internal/PendingAuthListenerTest.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/binder/src/test/java/io/grpc/binder/internal/PendingAuthListenerTest.java b/binder/src/test/java/io/grpc/binder/internal/PendingAuthListenerTest.java index 4c17dae302d..4ccdff75b69 100644 --- a/binder/src/test/java/io/grpc/binder/internal/PendingAuthListenerTest.java +++ b/binder/src/test/java/io/grpc/binder/internal/PendingAuthListenerTest.java @@ -1,22 +1,22 @@ package io.grpc.binder.internal; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import io.grpc.Metadata; +import io.grpc.NoopServerCall; import io.grpc.ServerCall; import io.grpc.ServerCallHandler; import io.grpc.Status; +import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; @@ -29,10 +29,9 @@ public final class PendingAuthListenerTest { @Rule public final MockitoRule mocks = MockitoJUnit.rule(); @Mock ServerCallHandler next; - @Mock ServerCall call; @Mock ServerCall.Listener delegate; - @Captor ArgumentCaptor statusCaptor; + private final ServerCall call = new NoopServerCall<>(); private final Metadata headers = new Metadata(); private final PendingAuthListener listener = new PendingAuthListener<>(); @@ -93,13 +92,24 @@ public void onCallbacks_withCancellation_runsPendingCallbacksAfterStartCall() { public void whenStartCallFails_closesTheCallWithInternalStatus() { IllegalStateException exception = new IllegalStateException("oops"); when(next.startCall(any(), any())).thenThrow(exception); + FakeServerCall fakeCall = new FakeServerCall(); listener.onReady(); - listener.startCall(call, headers, next); + listener.startCall(fakeCall, headers, next); - verify(call).close(statusCaptor.capture(), any()); - Status status = statusCaptor.getValue(); + Status status = fakeCall.closeStatus; + assertThat(status).isNotNull(); assertThat(status.getCode()).isEqualTo(Status.Code.INTERNAL); assertThat(status.getCause()).isSameInstanceAs(exception); } + + private static final class FakeServerCall extends NoopServerCall { + @Nullable Status closeStatus; + + @Override + public void close(Status status, Metadata trailers) { + checkState(closeStatus == null, "call already closed"); + closeStatus = status; + } + } }