### Question:
ClientCallImpl extends ClientCall<ReqT, RespT> { @Override public Attributes getAttributes() { if (stream != null) { return stream.getAttributes(); } return Attributes.EMPTY; } ClientCallImpl(
      MethodDescriptor<ReqT, RespT> method, Executor executor, CallOptions callOptions,
      ClientTransportProvider clientTransportProvider,
      ScheduledExecutorService deadlineCancellationExecutor,
      CallTracer channelCallsTracer,
      boolean retryEnabled); @Override void start(final Listener<RespT> observer, Metadata headers); @Override void request(int numMessages); @Override void cancel(@Nullable String message, @Nullable Throwable cause); @Override void halfClose(); @Override void sendMessage(ReqT message); @Override void setMessageCompression(boolean enabled); @Override boolean isReady(); @Override Attributes getAttributes(); @Override String toString(); @Override String getFullMethod();  }### Answer:
@Test public void getAttributes() { ClientCallImpl<Void, Void> call = new ClientCallImpl<Void, Void>( method, MoreExecutors.directExecutor(), baseCallOptions, provider, deadlineCancellationExecutor, channelCallTracer, false ); Attributes attrs = Attributes.newBuilder().set(Key.<String>create("fake key"), "fake value").build(); when(stream.getAttributes()).thenReturn(attrs); assertNotEquals(attrs, call.getAttributes()); call.start(callListener, new Metadata()); assertEquals(attrs, call.getAttributes()); }