X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FThreePhaseCommitCohortProxyTest.java;h=45319712ae87bfd3c30cc9704bddf66d4e25fea7;hb=4e5083390e8f3076b0c6cd9fc43f656c4a109c1d;hp=fd81c673d603e8f56ba097dab0b0f4ce674021d3;hpb=5464f50be733df1bbbe31cf05665d542d3b7c5e7;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java index fd81c673d6..45319712ae 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java @@ -5,37 +5,36 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.cluster.datastore; +import static java.util.Objects.requireNonNull; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doReturn; +import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.lenient; import static org.opendaylight.controller.cluster.datastore.DataStoreVersions.CURRENT_VERSION; import akka.actor.ActorSelection; import akka.actor.Props; -import akka.actor.UntypedActor; +import akka.actor.UntypedAbstractActor; import akka.dispatch.Dispatchers; import akka.dispatch.Futures; import akka.testkit.TestActorRef; import com.codahale.metrics.Snapshot; import com.codahale.metrics.Timer; -import com.google.common.base.Preconditions; -import com.google.common.base.Throwables; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.ThreePhaseCommitCohortProxy.CohortInfo; import org.opendaylight.controller.cluster.datastore.messages.AbortTransaction; @@ -45,27 +44,26 @@ import org.opendaylight.controller.cluster.datastore.messages.CanCommitTransacti import org.opendaylight.controller.cluster.datastore.messages.CanCommitTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.CommitTransaction; import org.opendaylight.controller.cluster.datastore.messages.CommitTransactionReply; -import org.opendaylight.controller.cluster.datastore.utils.ActorContext; +import org.opendaylight.controller.cluster.datastore.utils.ActorUtils; import org.opendaylight.controller.cluster.datastore.utils.MockClusterWrapper; import org.opendaylight.controller.cluster.datastore.utils.MockConfiguration; import org.opendaylight.controller.cluster.datastore.utils.PrimaryShardInfoFutureCache; import org.opendaylight.controller.cluster.raft.TestActorFactory; import org.opendaylight.controller.cluster.raft.utils.DoNothingActor; +@RunWith(MockitoJUnitRunner.StrictStubs.class) public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { - - @SuppressWarnings("serial") static class TestException extends RuntimeException { + private static final long serialVersionUID = 1L; + } - private ActorContext actorContext; + private ActorUtils actorUtils; @Mock private Timer commitTimer; - @Mock private Timer.Context commitTimerContext; - @Mock private Snapshot commitSnapshot; @@ -73,16 +71,13 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { private final List> cohortActors = new ArrayList<>(); private final TransactionIdentifier tx = nextTransactionId(); - @Before public void setUp() { - MockitoAnnotations.initMocks(this); - - actorContext = new ActorContext(getSystem(), actorFactory.createActor(Props.create(DoNothingActor.class)), + actorUtils = new ActorUtils(getSystem(), actorFactory.createActor(Props.create(DoNothingActor.class)), new MockClusterWrapper(), new MockConfiguration(), DatastoreContext.newBuilder().build(), new PrimaryShardInfoFutureCache()) { @Override - public Timer getOperationTimer(String operationName) { + public Timer getOperationTimer(final String operationName) { return commitTimer; } @@ -92,20 +87,20 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { } }; - doReturn(commitTimerContext).when(commitTimer).time(); - doReturn(commitSnapshot).when(commitTimer).getSnapshot(); + lenient().doReturn(commitTimerContext).when(commitTimer).time(); + lenient().doReturn(commitSnapshot).when(commitTimer).getSnapshot(); for (int i = 1; i < 11; i++) { // Keep on increasing the amount of time it takes to complete transaction for each tenth of a // percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on. - doReturn(TimeUnit.MILLISECONDS.toNanos(i) * 1D).when(commitSnapshot).getValue(i * 0.1); + lenient().doReturn(TimeUnit.MILLISECONDS.toNanos(i) * 1D).when(commitSnapshot).getValue(i * 0.1); } } @Test public void testCanCommitYesWithOneCohort() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.yes(CURRENT_VERSION)))), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)))), + tx); verifyCanCommit(proxy.canCommit(), true); verifyCohortActors(); @@ -113,9 +108,9 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitNoWithOneCohort() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.no(CURRENT_VERSION)))), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.no(CURRENT_VERSION)))), + tx); verifyCanCommit(proxy.canCommit(), false); verifyCohortActors(); @@ -123,12 +118,10 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitYesWithTwoCohorts() throws Exception { - List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.yes(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.yes(CURRENT_VERSION)))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION))), + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)))), + tx); verifyCanCommit(proxy.canCommit(), true); verifyCohortActors(); @@ -136,55 +129,49 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitNoWithThreeCohorts() throws Exception { - List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.yes(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( - CanCommitTransactionReply.no(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder(tx))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION))), + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.no(CURRENT_VERSION))), + newCohortInfo(new CohortActor.Builder(tx))), tx); verifyCanCommit(proxy.canCommit(), false); verifyCohortActors(); } - @Test(expected = TestException.class) - public void testCanCommitWithExceptionFailure() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(new TestException()))), tx); + @Test + public void testCanCommitWithExceptionFailure() { + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, + List.of(newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(new TestException()))), tx); - propagateExecutionExceptionCause(proxy.canCommit()); + propagateExecutionExceptionCause(proxy.canCommit(), TestException.class); } - @Test(expected = IllegalArgumentException.class) - public void testCanCommitWithInvalidResponseType() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectCanCommit("invalid"))), tx); + @Test + public void testCanCommitWithInvalidResponseType() { + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, + List.of(newCohortInfo(new CohortActor.Builder(tx).expectCanCommit("invalid"))), tx); - propagateExecutionExceptionCause(proxy.canCommit()); + assertEquals("Unexpected response type class java.lang.String", + propagateExecutionExceptionCause(proxy.canCommit(), IllegalArgumentException.class)); } - @Test(expected = TestException.class) + @Test public void testCanCommitWithFailedCohortFuture() throws Exception { - List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx)), - newCohortInfoWithFailedFuture(new TestException()), - newCohortInfo(new CohortActor.Builder(tx))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx)), + newCohortInfoWithFailedFuture(new TestException()), + newCohortInfo(new CohortActor.Builder(tx))), tx); - propagateExecutionExceptionCause(proxy.canCommit()); + propagateExecutionExceptionCause(proxy.canCommit(), TestException.class); } @Test public void testAllThreePhasesSuccessful() throws Exception { - List cohorts = Arrays.asList( - newCohortInfo( - new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) - .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), - newCohortInfo( - new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) - .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION)))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) + .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) + .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION)))), tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -192,38 +179,38 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { verifyCohortActors(); } - @Test(expected = TestException.class) + @Test public void testCommitWithExceptionFailure() throws Exception { - List cohorts = Arrays.asList( - newCohortInfo( - new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) - .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), - newCohortInfo( - new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) - .expectCommit(new TestException()))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) + .expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) + .expectCommit(new TestException()))), tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); - propagateExecutionExceptionCause(proxy.commit()); + propagateExecutionExceptionCause(proxy.commit(), TestException.class); } - @Test(expected = IllegalArgumentException.class) + @Test public void testCommitWithInvalidResponseType() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, - Arrays.asList(newCohortInfo(new CohortActor.Builder(tx) - .expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)).expectCommit("invalid"))), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils,List.of( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)) + .expectCommit("invalid"))), + tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); - propagateExecutionExceptionCause(proxy.commit()); + assertEquals("Unexpected response type class java.lang.String", + propagateExecutionExceptionCause(proxy.commit(), IllegalArgumentException.class)); } @Test public void testAbort() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectAbort( - AbortTransactionReply.instance(CURRENT_VERSION)))), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, + List.of(newCohortInfo(new CohortActor.Builder(tx).expectAbort( + AbortTransactionReply.instance(CURRENT_VERSION)))), + tx); verifySuccessfulFuture(proxy.abort()); verifyCohortActors(); @@ -231,8 +218,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAbortWithFailure() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder(tx).expectAbort(new RuntimeException("mock")))), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, + List.of(newCohortInfo(new CohortActor.Builder(tx).expectAbort(new RuntimeException("mock")))), tx); // The exception should not get propagated. verifySuccessfulFuture(proxy.abort()); @@ -241,9 +228,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAbortWithFailedCohortFuture() throws Exception { - List cohorts = Arrays.asList( - newCohortInfoWithFailedFuture(new TestException()), newCohortInfo(new CohortActor.Builder(tx))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of( + newCohortInfoWithFailedFuture(new TestException()), newCohortInfo(new CohortActor.Builder(tx))), tx); verifySuccessfulFuture(proxy.abort()); verifyCohortActors(); @@ -251,8 +237,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testWithNoCohorts() throws Exception { - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, - Collections.emptyList(), tx); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorUtils, List.of(), tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -260,30 +245,26 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { verifyCohortActors(); } - private void propagateExecutionExceptionCause(ListenableFuture future) throws Exception { - - try { - future.get(5, TimeUnit.SECONDS); - fail("Expected ExecutionException"); - } catch (ExecutionException e) { - verifyCohortActors(); - Throwables.propagateIfInstanceOf(e.getCause(), Exception.class); - Throwables.propagate(e.getCause()); - } + private String propagateExecutionExceptionCause(final ListenableFuture future, + final Class expected) { + final var ex = assertThrows(ExecutionException.class, () -> future.get(5, TimeUnit.SECONDS)).getCause(); + verifyCohortActors(); + assertThat(ex, instanceOf(expected)); + return ex.getMessage(); } - private CohortInfo newCohortInfo(CohortActor.Builder builder, final short version) { + private CohortInfo newCohortInfo(final CohortActor.Builder builder, final short version) { TestActorRef actor = actorFactory.createTestActor(builder.props() .withDispatcher(Dispatchers.DefaultDispatcherId()), actorFactory.generateActorId("cohort")); cohortActors.add(actor); return new CohortInfo(Futures.successful(getSystem().actorSelection(actor.path())), () -> version); } - private CohortInfo newCohortInfo(CohortActor.Builder builder) { + private CohortInfo newCohortInfo(final CohortActor.Builder builder) { return newCohortInfo(builder, CURRENT_VERSION); } - private static CohortInfo newCohortInfoWithFailedFuture(Exception failure) { + private static CohortInfo newCohortInfoWithFailedFuture(final Exception failure) { return new CohortInfo(Futures.failed(failure), () -> CURRENT_VERSION); } @@ -294,7 +275,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { } @SuppressWarnings("checkstyle:IllegalCatch") - private T verifySuccessfulFuture(ListenableFuture future) throws Exception { + private T verifySuccessfulFuture(final ListenableFuture future) throws Exception { try { return future.get(5, TimeUnit.SECONDS); } catch (Exception e) { @@ -303,24 +284,24 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { } } - private void verifyCanCommit(ListenableFuture future, boolean expected) throws Exception { + private void verifyCanCommit(final ListenableFuture future, final boolean expected) throws Exception { Boolean actual = verifySuccessfulFuture(future); assertEquals("canCommit", expected, actual); } - private static class CohortActor extends UntypedActor { + private static class CohortActor extends UntypedAbstractActor { private final Builder builder; private final AtomicInteger canCommitCount = new AtomicInteger(); private final AtomicInteger commitCount = new AtomicInteger(); private final AtomicInteger abortCount = new AtomicInteger(); private volatile AssertionError assertionError; - private CohortActor(Builder builder) { + CohortActor(final Builder builder) { this.builder = builder; } @Override - public void onReceive(Object message) { + public void onReceive(final Object message) { if (CanCommitTransaction.isSerializedType(message)) { canCommitCount.incrementAndGet(); onMessage("CanCommitTransaction", message, CanCommitTransaction.fromSerializable(message), @@ -338,12 +319,12 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { } } - private void onMessage(String name, Object rawMessage, AbstractThreePhaseCommitMessage actualMessage, - Class expType, Object reply) { + private void onMessage(final String name, final Object rawMessage, + final AbstractThreePhaseCommitMessage actualMessage, final Class expType, final Object reply) { try { assertNotNull("Unexpected " + name, expType); assertEquals(name + " type", expType, rawMessage.getClass()); - assertEquals(name + " transactionId", builder.transactionId, actualMessage.getTransactionID()); + assertEquals(name + " transactionId", builder.transactionId, actualMessage.getTransactionId()); if (reply instanceof Throwable) { getSender().tell(new akka.actor.Status.Failure((Throwable)reply), self()); @@ -382,37 +363,37 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { private Object abortReply; private final TransactionIdentifier transactionId; - Builder(TransactionIdentifier transactionId) { - this.transactionId = Preconditions.checkNotNull(transactionId); + Builder(final TransactionIdentifier transactionId) { + this.transactionId = requireNonNull(transactionId); } - Builder expectCanCommit(Class newExpCanCommitType, Object newCanCommitReply) { - this.expCanCommitType = newExpCanCommitType; - this.canCommitReply = newCanCommitReply; + Builder expectCanCommit(final Class newExpCanCommitType, final Object newCanCommitReply) { + expCanCommitType = newExpCanCommitType; + canCommitReply = newCanCommitReply; return this; } - Builder expectCanCommit(Object newCanCommitReply) { + Builder expectCanCommit(final Object newCanCommitReply) { return expectCanCommit(CanCommitTransaction.class, newCanCommitReply); } - Builder expectCommit(Class newExpCommitType, Object newCommitReply) { - this.expCommitType = newExpCommitType; - this.commitReply = newCommitReply; + Builder expectCommit(final Class newExpCommitType, final Object newCommitReply) { + expCommitType = newExpCommitType; + commitReply = newCommitReply; return this; } - Builder expectCommit(Object newCommitReply) { + Builder expectCommit(final Object newCommitReply) { return expectCommit(CommitTransaction.class, newCommitReply); } - Builder expectAbort(Class newExpAbortType, Object newAbortReply) { - this.expAbortType = newExpAbortType; - this.abortReply = newAbortReply; + Builder expectAbort(final Class newExpAbortType, final Object newAbortReply) { + expAbortType = newExpAbortType; + abortReply = newAbortReply; return this; } - Builder expectAbort(Object newAbortReply) { + Builder expectAbort(final Object newAbortReply) { return expectAbort(AbortTransaction.class, newAbortReply); }