### Question:
LocalSigner implements Signer { @Override public SafeFuture<BLSSignature> signVoluntaryExit( final VoluntaryExit voluntaryExit, final ForkInfo forkInfo) { return sign(signingRootForSignVoluntaryExit(voluntaryExit, forkInfo)); } LocalSigner(final BLSKeyPair keypair, final AsyncRunner asyncRunner); @Override SafeFuture<BLSSignature> createRandaoReveal(final UInt64 epoch, final ForkInfo forkInfo); @Override SafeFuture<BLSSignature> signBlock(final BeaconBlock block, final ForkInfo forkInfo); @Override SafeFuture<BLSSignature> signAttestationData(
      final AttestationData attestationData, final ForkInfo forkInfo); @Override SafeFuture<BLSSignature> signAggregationSlot(final UInt64 slot, final ForkInfo forkInfo); @Override SafeFuture<BLSSignature> signAggregateAndProof(
      final AggregateAndProof aggregateAndProof, final ForkInfo forkInfo); @Override SafeFuture<BLSSignature> signVoluntaryExit(
      final VoluntaryExit voluntaryExit, final ForkInfo forkInfo); @Override boolean isLocal();  }### Answer:
@Test public void shouldSignVoluntaryExit() { final VoluntaryExit voluntaryExit = dataStructureUtil.randomVoluntaryExit(); final BLSSignature expectedSignature = BLSSignature.fromBytesCompressed( Bytes.fromBase64String( "g9JMIY7595zlrapmwbnCLj8+WX7ry3yfBwNNPQ9mRJ0m+rXTwgDpmsxpzs+kX4F8Bg+KRz+v5BPKEAWkeh8bJBDX7psiELLI3q9WmCX95MXT080jByrtYLdz1Qy3OUKK")); final SafeFuture<BLSSignature> result = signer.signVoluntaryExit(voluntaryExit, fork); asyncRunner.executeQueuedActions(); assertThat(result).isCompletedWithValue(expectedSignature); }