diff --git a/test/src/main/java/org/axonframework/test/GivenWhenThenTestFixture.java b/test/src/main/java/org/axonframework/test/GivenWhenThenTestFixture.java index 9ebc0f7089..d20dd50786 100644 --- a/test/src/main/java/org/axonframework/test/GivenWhenThenTestFixture.java +++ b/test/src/main/java/org/axonframework/test/GivenWhenThenTestFixture.java @@ -55,7 +55,6 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Deque; import java.util.HashSet; @@ -81,21 +80,18 @@ public class GivenWhenThenTestFixture implements FixtureConfiguration, TestExecutor { private static final Logger logger = LoggerFactory.getLogger(GivenWhenThenTestFixture.class); - + private final Class aggregateType; private Repository repository; private SimpleCommandBus commandBus; private EventBus eventBus; private Object aggregateIdentifier; - private EventStore eventStore; - - private Collection givenEvents; + private Deque givenEvents; private Deque storedEvents; private List publishedEvents; private long sequenceNumber = 0; private AggregateRoot workingAggregate; private boolean reportIllegalStateChange = true; - private final Class aggregateType; private boolean explicitCommandHandlersSet; /** @@ -342,7 +338,7 @@ private void ensureValuesEqual(Object workingValue, Object eventSourcedValue, St private void clearGivenWhenState() { storedEvents = new LinkedList(); publishedEvents = new ArrayList(); - givenEvents = new ArrayList(); + givenEvents = new LinkedList(); sequenceNumber = 0; } @@ -372,6 +368,84 @@ public Repository getRepository() { return repository; } + private static class ComparationEntry { + + private final Object workingObject; + private final Object eventSourceObject; + + public ComparationEntry(Object workingObject, Object eventSourceObject) { + this.workingObject = workingObject; + this.eventSourceObject = eventSourceObject; + } + + @SuppressWarnings("RedundantIfStatement") + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ComparationEntry that = (ComparationEntry) o; + + if (!eventSourceObject.equals(that.eventSourceObject)) { + return false; + } + if (!workingObject.equals(that.workingObject)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = workingObject.hashCode(); + result = 31 * result + eventSourceObject.hashCode(); + return result; + } + } + + private static class IdentifierValidatingRepository implements Repository { + + private final Repository delegate; + + public IdentifierValidatingRepository(Repository delegate) { + this.delegate = delegate; + } + + @Override + public T load(Object aggregateIdentifier, Long expectedVersion) { + T aggregate = delegate.load(aggregateIdentifier, expectedVersion); + validateIdentifier(aggregateIdentifier, aggregate); + return aggregate; + } + + @Override + public T load(Object aggregateIdentifier) { + T aggregate = delegate.load(aggregateIdentifier, null); + validateIdentifier(aggregateIdentifier, aggregate); + return aggregate; + } + + private void validateIdentifier(Object aggregateIdentifier, T aggregate) { + if (aggregateIdentifier != null && !aggregateIdentifier.equals(aggregate.getIdentifier())) { + throw new AssertionError(String.format( + "The aggregate used in this fixture was initialized with an identifier different than " + + "the one used to load it. Loaded [%s], but actual identifier is [%s].\n" + + "Make sure the identifier passed in the Command matches that of the given Events.", + aggregateIdentifier, aggregate.getIdentifier())); + } + } + + @Override + public void add(T aggregate) { + delegate.add(aggregate); + } + } + private class RecordingEventStore implements EventStore { @Override @@ -379,8 +453,15 @@ public void appendEvents(String type, DomainEventStream events) { while (events.hasNext()) { DomainEventMessage next = events.next(); validateIdentifier(next.getAggregateIdentifier().getClass()); - if (!storedEvents.isEmpty()) { - DomainEventMessage lastEvent = storedEvents.peekLast(); + + if (aggregateIdentifier == null) { + aggregateIdentifier = next.getAggregateIdentifier(); + injectAggregateIdentifier(); + } + + DomainEventMessage lastEvent = (storedEvents.isEmpty() ? givenEvents : storedEvents).peekLast(); + + if (lastEvent != null) { if (!lastEvent.getAggregateIdentifier().equals(next.getAggregateIdentifier())) { throw new EventStoreException("Writing events for an unexpected aggregate. This could " + "indicate that a wrong aggregate is being triggered."); @@ -391,10 +472,6 @@ public void appendEvents(String type, DomainEventStream events) { next.getSequenceNumber())); } } - if (aggregateIdentifier == null) { - aggregateIdentifier = next.getAggregateIdentifier(); - injectAggregateIdentifier(); - } storedEvents.add(next); } } @@ -475,84 +552,6 @@ public void onPrepareCommit(UnitOfWork unitOfWork, Set aggregateR } } - private static class ComparationEntry { - - private final Object workingObject; - private final Object eventSourceObject; - - public ComparationEntry(Object workingObject, Object eventSourceObject) { - this.workingObject = workingObject; - this.eventSourceObject = eventSourceObject; - } - - @SuppressWarnings("RedundantIfStatement") - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - ComparationEntry that = (ComparationEntry) o; - - if (!eventSourceObject.equals(that.eventSourceObject)) { - return false; - } - if (!workingObject.equals(that.workingObject)) { - return false; - } - - return true; - } - - @Override - public int hashCode() { - int result = workingObject.hashCode(); - result = 31 * result + eventSourceObject.hashCode(); - return result; - } - } - - private static class IdentifierValidatingRepository implements Repository { - - private final Repository delegate; - - public IdentifierValidatingRepository(Repository delegate) { - this.delegate = delegate; - } - - @Override - public T load(Object aggregateIdentifier, Long expectedVersion) { - T aggregate = delegate.load(aggregateIdentifier, expectedVersion); - validateIdentifier(aggregateIdentifier, aggregate); - return aggregate; - } - - @Override - public T load(Object aggregateIdentifier) { - T aggregate = delegate.load(aggregateIdentifier, null); - validateIdentifier(aggregateIdentifier, aggregate); - return aggregate; - } - - private void validateIdentifier(Object aggregateIdentifier, T aggregate) { - if (aggregateIdentifier != null && !aggregateIdentifier.equals(aggregate.getIdentifier())) { - throw new AssertionError(String.format( - "The aggregate used in this fixture was initialized with an identifier different than " - + "the one used to load it. Loaded [%s], but actual identifier is [%s].\n" - + "Make sure the identifier passed in the Command matches that of the given Events.", - aggregateIdentifier, aggregate.getIdentifier())); - } - } - - @Override - public void add(T aggregate) { - delegate.add(aggregate); - } - } - private class ExecutionExceptionAwareCallback implements CommandCallback { private FixtureExecutionException exception; diff --git a/test/src/test/java/org/axonframework/test/FixtureTest_Annotated.java b/test/src/test/java/org/axonframework/test/FixtureTest_Annotated.java index 0aef145175..4a3d8b0876 100644 --- a/test/src/test/java/org/axonframework/test/FixtureTest_Annotated.java +++ b/test/src/test/java/org/axonframework/test/FixtureTest_Annotated.java @@ -106,8 +106,8 @@ public void testFixtureGivenCommands_ResourcesAvailable() { public void testAggregate_InjectCustomResourceAfterCreatingAnnotatedHandler() { // a 'when' will cause command handlers to be registered. fixture.registerInjectableResource(new HardToCreateResource()); - fixture.given(new MyEvent("AggregateId", 1), new MyEvent("AggregateId", 2)). - when(new CreateAggregateCommand()); + fixture.given() + .when(new CreateAggregateCommand("AggregateId")); fixture.registerInjectableResource("I am injectable"); } diff --git a/test/src/test/java/org/axonframework/test/FixtureTest_Generic.java b/test/src/test/java/org/axonframework/test/FixtureTest_Generic.java index bdf6d5bb90..13fb65fe05 100644 --- a/test/src/test/java/org/axonframework/test/FixtureTest_Generic.java +++ b/test/src/test/java/org/axonframework/test/FixtureTest_Generic.java @@ -58,7 +58,7 @@ public void testConfigureCustomAggregateFactory() { fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())); fixture.given(new MyEvent("id1", 1)) - .when(new TestCommand("id1")); + .when(new TestCommand("id1")); verify(mockAggregateFactory).createAggregate(eq("id1"), isA(DomainEventMessage.class)); } @@ -83,6 +83,15 @@ public void testAggregateIdentifier_ServerGeneratedIdentifier() { .when(new CreateAggregateCommand()); } + @Test + public void testStoringExistingAggregateGeneratesException() { + fixture.registerAggregateFactory(mockAggregateFactory); + fixture.registerAnnotatedCommandHandler(new MyCommandHandler(fixture.getRepository(), fixture.getEventBus())); + fixture.given(new MyEvent("aggregateId", 1)) + .when(new CreateAggregateCommand("aggregateId")) + .expectException(EventStoreException.class); + } + @Test(expected = FixtureExecutionException.class) public void testInjectResources_CommandHandlerAlreadyRegistered() { fixture.registerAggregateFactory(mockAggregateFactory); @@ -99,7 +108,7 @@ public void testAggregateIdentifier_IdentifierAutomaticallyDeducted() { .expectEvents(new MyEvent("AggregateId", 3)); DomainEventStream events = fixture.getEventStore().readEvents("StandardAggregate", "AggregateId"); - for (int t=0;t<3;t++) { + for (int t = 0; t < 3; t++) { assertTrue(events.hasNext()); DomainEventMessage next = events.next(); assertEquals("AggregateId", next.getAggregateIdentifier());