### Question:
LocalSigner implements Signer { @Override public SafeFuture<BLSSignature> signAttestationData( final AttestationData attestationData, final ForkInfo forkInfo) { return sign(signingRootForSignAttestationData(attestationData, 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 shouldSignAttestationData() { final AttestationData attestationData = dataStructureUtil.randomAttestationData(); final BLSSignature expectedSignature = BLSSignature.fromBytesCompressed( Bytes.fromBase64String( "l1DUv3fmbvZanhCaaraMk2PKAl+33sf3UHMbxkv18CKILzzIz+Hr6hnLXCHqWQYEGKTtLcf6OLV7Z+Y21BW2bBtJHXJqqzvWkec/j0X0hWaEoWOSAs20sipO1WSIUY2m")); final SafeFuture<BLSSignature> result = signer.signAttestationData(attestationData, fork); asyncRunner.executeQueuedActions(); assertThat(result).isCompletedWithValue(expectedSignature); }