diff --git a/src/main/java/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.java b/src/main/java/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.java index ef27fd1e6..23c7a7afe 100644 --- a/src/main/java/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.java +++ b/src/main/java/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.java @@ -29,7 +29,6 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.reactivestreams.Publisher; - import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.core.io.Resource; @@ -207,7 +206,7 @@ public class ResourceReaderRepositoryPopulator implements RepositoryPopulator, A RepositoryInformation repositoryInformation = repositories.getRequiredRepositoryInformation(domainType); Object repository = repositories.getRepositoryFor(domainType).orElseThrow( - () -> new IllegalArgumentException(String.format("No repository found for domain type: %s", domainType))); + () -> new IllegalStateException(String.format("No repository found for domain type: %s", domainType))); if (repositoryInformation.isReactiveRepository()) { return repository instanceof ReactiveCrudRepository ? new ReactiveCrudRepositoryPersister(repository) @@ -244,13 +243,13 @@ public class ResourceReaderRepositoryPopulator implements RepositoryPopulator, A private final Object repository; public ReflectivePersister(RepositoryMetadata metadata, Object repository) { - this.methods = new DefaultCrudMethods(metadata); + + this.methods = metadata.getCrudMethods(); this.repository = repository; } @Override public void save(Object object) { - doPersist(object); } diff --git a/src/test/java/org/springframework/data/repository/init/ReactiveResourceReaderRepositoryPopulatorUnitTests.java b/src/test/java/org/springframework/data/repository/init/ReactiveResourceReaderRepositoryPopulatorUnitTests.java index f2a83eece..ef7260312 100755 --- a/src/test/java/org/springframework/data/repository/init/ReactiveResourceReaderRepositoryPopulatorUnitTests.java +++ b/src/test/java/org/springframework/data/repository/init/ReactiveResourceReaderRepositoryPopulatorUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; * Unit tests for {@link ResourceReaderRepositoryPopulator} using reactive repositories. * * @author Mark Paluch + * @author Christoph Strobl */ @SpringJUnitConfig(classes = ReactiveResourceReaderRepositoryPopulatorUnitTests.ReactiveSampleConfiguration.class) class ReactiveResourceReaderRepositoryPopulatorUnitTests { @@ -64,7 +65,7 @@ class ReactiveResourceReaderRepositoryPopulatorUnitTests { this.resource = mock(Resource.class); } - @Test + @Test // GH-2558 void storesSingleUsingReactiveRepositoryObjectCorrectly() throws Exception { ReactivePerson reference = new ReactivePerson(); @@ -74,7 +75,7 @@ class ReactiveResourceReaderRepositoryPopulatorUnitTests { verify(personRepository).save(reference); } - @Test + @Test // GH-2558 void storesSingleUsingSimpleReactiveRepositoryObjectCorrectly() throws Exception { ReactiveContact reference = new ReactiveContact(); @@ -84,7 +85,7 @@ class ReactiveResourceReaderRepositoryPopulatorUnitTests { verify(contactRepository).save(reference); } - @Test + @Test // GH-2558 void storesSingleUsingRxJavaRepositoryObjectCorrectly() throws Exception { ReactiveUser reference = new ReactiveUser(); @@ -105,7 +106,7 @@ class ReactiveResourceReaderRepositoryPopulatorUnitTests { verify(publisher, times(1)).publishEvent(event); } - private RepositoryPopulator setUpReferenceAndInitialize(Object reference, ApplicationEventPublisher publish) + private RepositoryPopulator setUpReferenceAndInitialize(Object reference, ApplicationEventPublisher publisher) throws Exception { when(reader.readFrom(any(), any())).thenReturn(reference); diff --git a/src/test/java/org/springframework/data/repository/init/RepositoryPersisterFactoryUnitTests.java b/src/test/java/org/springframework/data/repository/init/RepositoryPersisterFactoryUnitTests.java new file mode 100644 index 000000000..6e45a15bd --- /dev/null +++ b/src/test/java/org/springframework/data/repository/init/RepositoryPersisterFactoryUnitTests.java @@ -0,0 +1,105 @@ +/* + * Copyright 2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.repository.init; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.core.RepositoryInformation; +import org.springframework.data.repository.init.ResourceReaderRepositoryPopulator.RepositoryPersisterFactory; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.data.repository.support.Repositories; + +/** + * @author Christoph Strobl + */ +@ExtendWith(MockitoExtension.class) +class RepositoryPersisterFactoryUnitTests { + + @Mock Repositories repositories; + @Mock RepositoryInformation repoInfo; + RepositoryPersisterFactory factory; + + @BeforeEach + void beforeEach() { + factory = new RepositoryPersisterFactory(repositories); + } + + @Test // GH-2558 + void errorsOnNoRepoFoundForType() { + + assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> factory.getPersisterFor(Object.class)) + .withMessageContaining("No repository found"); + } + + @Test // GH-2558 + void usesCrudRepoPersisterForNonReactiveCrudRepo() { + + CrudRepository crudRepository = mock(CrudRepository.class); + when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo); + when(repoInfo.isReactiveRepository()).thenReturn(false); + when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(crudRepository)); + + assertThat(factory.getPersisterFor(Object.class)) + .satisfies(it -> it.getClass().getName().contains("CrudRepositoryPersister")); + } + + @Test // GH-2558 + void usesReactiveCrudRepoPersisterForReactiveCrudRepo() { + + ReactiveCrudRepository crudRepository = mock(ReactiveCrudRepository.class); + when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo); + when(repoInfo.isReactiveRepository()).thenReturn(true); + when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(crudRepository)); + + assertThat(factory.getPersisterFor(Object.class)) + .satisfies(it -> it.getClass().getName().contains("ReactiveCrudRepositoryPersister")); + } + + @Test // GH-2558 + void usesReflectiveRepoPersisterForNonReactiveNonCrudRepo() { + + Repository repository = mock(Repository.class); + when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo); + when(repoInfo.isReactiveRepository()).thenReturn(false); + when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(repository)); + + assertThat(factory.getPersisterFor(Object.class)) + .satisfies(it -> it.getClass().getName().contains("ReflectivePersister")); + } + + @Test // GH-2558 + void usesReactiveReflectiveRepoPersisterForReactiveNonCrudRepo() { + + Repository repository = mock(Repository.class); + when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo); + when(repoInfo.isReactiveRepository()).thenReturn(true); + when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(repository)); + + assertThat(factory.getPersisterFor(Object.class)) + .satisfies(it -> it.getClass().getName().contains("ReflectiveReactivePersister")); + } +}