Skip to content

Commit f08c473

Browse files
christophstroblodrotbohm
authored andcommitted
Polishing.
Reuse CRUD metdata from repository information and add some tests for the persister factory.
1 parent e5540b4 commit f08c473

File tree

3 files changed

+114
-9
lines changed

3 files changed

+114
-9
lines changed

src/main/java/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.apache.commons.logging.Log;
3030
import org.apache.commons.logging.LogFactory;
3131
import org.reactivestreams.Publisher;
32-
3332
import org.springframework.context.ApplicationEventPublisher;
3433
import org.springframework.context.ApplicationEventPublisherAware;
3534
import org.springframework.core.io.Resource;
@@ -207,7 +206,7 @@ private RepositoryPersister createPersisterFor(Class<?> domainType) {
207206

208207
RepositoryInformation repositoryInformation = repositories.getRequiredRepositoryInformation(domainType);
209208
Object repository = repositories.getRepositoryFor(domainType).orElseThrow(
210-
() -> new IllegalArgumentException(String.format("No repository found for domain type: %s", domainType)));
209+
() -> new IllegalStateException(String.format("No repository found for domain type: %s", domainType)));
211210

212211
if (repositoryInformation.isReactiveRepository()) {
213212
return repository instanceof ReactiveCrudRepository ? new ReactiveCrudRepositoryPersister(repository)
@@ -244,13 +243,13 @@ private static class ReflectivePersister implements RepositoryPersister {
244243
private final Object repository;
245244

246245
public ReflectivePersister(RepositoryMetadata metadata, Object repository) {
247-
this.methods = new DefaultCrudMethods(metadata);
246+
247+
this.methods = metadata.getCrudMethods();
248248
this.repository = repository;
249249
}
250250

251251
@Override
252252
public void save(Object object) {
253-
254253
doPersist(object);
255254
}
256255

src/test/java/org/springframework/data/repository/init/ReactiveResourceReaderRepositoryPopulatorUnitTests.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@
4343
* Unit tests for {@link ResourceReaderRepositoryPopulator} using reactive repositories.
4444
*
4545
* @author Mark Paluch
46+
* @author Christoph Strobl
4647
*/
4748
@SpringJUnitConfig(classes = ReactiveResourceReaderRepositoryPopulatorUnitTests.ReactiveSampleConfiguration.class)
4849
class ReactiveResourceReaderRepositoryPopulatorUnitTests {
@@ -64,7 +65,7 @@ void setUp() {
6465
this.resource = mock(Resource.class);
6566
}
6667

67-
@Test
68+
@Test // GH-2558
6869
void storesSingleUsingReactiveRepositoryObjectCorrectly() throws Exception {
6970

7071
ReactivePerson reference = new ReactivePerson();
@@ -74,7 +75,7 @@ void storesSingleUsingReactiveRepositoryObjectCorrectly() throws Exception {
7475
verify(personRepository).save(reference);
7576
}
7677

77-
@Test
78+
@Test // GH-2558
7879
void storesSingleUsingSimpleReactiveRepositoryObjectCorrectly() throws Exception {
7980

8081
ReactiveContact reference = new ReactiveContact();
@@ -84,7 +85,7 @@ void storesSingleUsingSimpleReactiveRepositoryObjectCorrectly() throws Exception
8485
verify(contactRepository).save(reference);
8586
}
8687

87-
@Test
88+
@Test // GH-2558
8889
void storesSingleUsingRxJavaRepositoryObjectCorrectly() throws Exception {
8990

9091
ReactiveUser reference = new ReactiveUser();
@@ -105,7 +106,7 @@ void emitsRepositoriesPopulatedEventIfPublisherConfigured() throws Exception {
105106
verify(publisher, times(1)).publishEvent(event);
106107
}
107108

108-
private RepositoryPopulator setUpReferenceAndInitialize(Object reference, ApplicationEventPublisher publish)
109+
private RepositoryPopulator setUpReferenceAndInitialize(Object reference, ApplicationEventPublisher publisher)
109110
throws Exception {
110111

111112
when(reader.readFrom(any(), any())).thenReturn(reference);
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Copyright 2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.repository.init;
17+
18+
import static org.assertj.core.api.Assertions.*;
19+
import static org.mockito.Mockito.*;
20+
21+
import java.util.Optional;
22+
23+
import org.junit.jupiter.api.BeforeEach;
24+
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.extension.ExtendWith;
26+
import org.mockito.Mock;
27+
import org.mockito.Mockito;
28+
import org.mockito.junit.jupiter.MockitoExtension;
29+
import org.springframework.data.repository.CrudRepository;
30+
import org.springframework.data.repository.Repository;
31+
import org.springframework.data.repository.core.RepositoryInformation;
32+
import org.springframework.data.repository.init.ResourceReaderRepositoryPopulator.RepositoryPersisterFactory;
33+
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
34+
import org.springframework.data.repository.support.Repositories;
35+
36+
/**
37+
* @author Christoph Strobl
38+
*/
39+
@ExtendWith(MockitoExtension.class)
40+
class RepositoryPersisterFactoryUnitTests {
41+
42+
@Mock Repositories repositories;
43+
@Mock RepositoryInformation repoInfo;
44+
RepositoryPersisterFactory factory;
45+
46+
@BeforeEach
47+
void beforeEach() {
48+
factory = new RepositoryPersisterFactory(repositories);
49+
}
50+
51+
@Test // GH-2558
52+
void errorsOnNoRepoFoundForType() {
53+
54+
assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> factory.getPersisterFor(Object.class))
55+
.withMessageContaining("No repository found");
56+
}
57+
58+
@Test // GH-2558
59+
void usesCrudRepoPersisterForNonReactiveCrudRepo() {
60+
61+
CrudRepository<?, ?> crudRepository = mock(CrudRepository.class);
62+
when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo);
63+
when(repoInfo.isReactiveRepository()).thenReturn(false);
64+
when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(crudRepository));
65+
66+
assertThat(factory.getPersisterFor(Object.class))
67+
.satisfies(it -> it.getClass().getName().contains("CrudRepositoryPersister"));
68+
}
69+
70+
@Test // GH-2558
71+
void usesReactiveCrudRepoPersisterForReactiveCrudRepo() {
72+
73+
ReactiveCrudRepository<?, ?> crudRepository = mock(ReactiveCrudRepository.class);
74+
when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo);
75+
when(repoInfo.isReactiveRepository()).thenReturn(true);
76+
when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(crudRepository));
77+
78+
assertThat(factory.getPersisterFor(Object.class))
79+
.satisfies(it -> it.getClass().getName().contains("ReactiveCrudRepositoryPersister"));
80+
}
81+
82+
@Test // GH-2558
83+
void usesReflectiveRepoPersisterForNonReactiveNonCrudRepo() {
84+
85+
Repository<?, ?> repository = mock(Repository.class);
86+
when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo);
87+
when(repoInfo.isReactiveRepository()).thenReturn(false);
88+
when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(repository));
89+
90+
assertThat(factory.getPersisterFor(Object.class))
91+
.satisfies(it -> it.getClass().getName().contains("ReflectivePersister"));
92+
}
93+
94+
@Test // GH-2558
95+
void usesReactiveReflectiveRepoPersisterForReactiveNonCrudRepo() {
96+
97+
Repository<?, ?> repository = mock(Repository.class);
98+
when(repositories.getRequiredRepositoryInformation(any())).thenReturn(repoInfo);
99+
when(repoInfo.isReactiveRepository()).thenReturn(true);
100+
when(repositories.getRepositoryFor(Mockito.any())).thenReturn(Optional.of(repository));
101+
102+
assertThat(factory.getPersisterFor(Object.class))
103+
.satisfies(it -> it.getClass().getName().contains("ReflectiveReactivePersister"));
104+
}
105+
}

0 commit comments

Comments
 (0)