DATACMNS-1067 - Polishing.

Revert change to only invoke cleanup method if events have been exposed. We now again invoke the cleanup method for every aggregate. Changed the publication of events from the aggregate instances that were handed into the method to the ones the save method returns as the save call might return different object instances.

Cleanups in the unit tests. Moved newly introduced methods to the bottom of the test case class. Extracted method to set up mock method invocation.

Original pull request: #216.
This commit is contained in:
Oliver Gierke
2017-05-15 15:39:52 +02:00
parent 417fad340b
commit 71977c9309
2 changed files with 50 additions and 51 deletions

View File

@@ -52,7 +52,7 @@ import org.springframework.data.repository.core.support.EventPublishingRepositor
* @author Yuki Yoshida
* @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness)
*/
@RunWith(MockitoJUnitRunner.class)
@RunWith(MockitoJUnitRunner.Silent.class)
public class EventPublishingRepositoryProxyPostProcessorUnitTests {
@Mock ApplicationEventPublisher publisher;
@@ -102,40 +102,6 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
verify(publisher, times(0)).publishEvent(any());
}
@Test // DATACMNS-1067
public void clearEventsDoesNotExposedByEntity() {
EventsWithClearing entity = spy(EventsWithClearing.of(Collections.emptyList()));
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher);
verify(entity, times(0)).clearDomainEvents();
}
@Test // DATACMNS-1067
public void clearEventsExposedByEntity() {
EventsWithClearing entity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent())));
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher);
verify(entity, times(1)).clearDomainEvents();
}
@Test // DATACMNS-1067
public void clearEventsExposedByEntities() {
EventsWithClearing firstEntity = spy(EventsWithClearing.of(Collections.emptyList()));
EventsWithClearing secondEntity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent())));
Collection<EventsWithClearing> entities = Arrays.asList(firstEntity, secondEntity);
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entities, publisher);
verify(firstEntity, times(0)).clearDomainEvents();
verify(secondEntity, times(1)).clearDomainEvents();
}
@Test // DATACMNS-928
public void doesNotCreatePublishingMethodIfNoAnnotationDetected() {
assertThat(EventPublishingMethod.of(Object.class)).isNull();
@@ -144,11 +110,9 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
@Test // DATACMNS-928
public void interceptsSaveMethod() throws Throwable {
doReturn(SampleRepository.class.getMethod("save", Object.class)).when(invocation).getMethod();
SomeEvent event = new SomeEvent();
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
doReturn(new Object[] { sample }).when(invocation).getArguments();
mockInvocation(invocation, SampleRepository.class.getMethod("save", Object.class), sample);
EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
@@ -200,9 +164,7 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
SomeEvent event = new SomeEvent();
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
doReturn(new Object[] { Collections.singletonList(sample) }).when(invocation).getArguments();
doReturn(SampleRepository.class.getMethod("saveAll", Iterable.class)).when(invocation).getMethod();
mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), sample);
EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
@@ -228,12 +190,9 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
@Test // DATACMNS-1113
public void invokesEventsForMethodsThatStartsWithSave() throws Throwable {
Method method = SampleRepository.class.getMethod("saveAndFlush", MultipleEvents.class);
doReturn(method).when(invocation).getMethod();
SomeEvent event = new SomeEvent();
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
doReturn(new Object[] { sample }).when(invocation).getArguments();
mockInvocation(invocation, SampleRepository.class.getMethod("saveAndFlush", MultipleEvents.class), sample);
EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
@@ -242,6 +201,48 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
verify(publisher).publishEvent(event);
}
@Test // DATACMNS-1067
public void clearsEventsEvenIfNoneWereExposedToPublish() {
EventsWithClearing entity = spy(EventsWithClearing.of(Collections.emptyList()));
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher);
verify(entity, times(1)).clearDomainEvents();
}
@Test // DATACMNS-1067
public void clearsEventsIfThereWereSomeToBePublished() {
EventsWithClearing entity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent())));
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher);
verify(entity, times(1)).clearDomainEvents();
}
@Test // DATACMNS-1067
public void clearsEventsForOperationOnMutlipleAggregates() {
EventsWithClearing firstEntity = spy(EventsWithClearing.of(Collections.emptyList()));
EventsWithClearing secondEntity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent())));
Collection<EventsWithClearing> entities = Arrays.asList(firstEntity, secondEntity);
EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entities, publisher);
verify(firstEntity, times(1)).clearDomainEvents();
verify(secondEntity, times(1)).clearDomainEvents();
}
private static void mockInvocation(MethodInvocation invocation, Method method, Object parameterAndReturnValue)
throws Throwable {
doReturn(method).when(invocation).getMethod();
doReturn(new Object[] { parameterAndReturnValue }).when(invocation).getArguments();
doReturn(parameterAndReturnValue).when(invocation).proceed();
}
@Value(staticConstructor = "of")
static class MultipleEvents {
@Getter(onMethod = @__(@DomainEvents)) Collection<? extends Object> events;