DATACMNS-1538 - Repository proxy post processors in CDI.

Add support for custom repository proxy post processors in CDI.

Original pull request: #396.
This commit is contained in:
arielcarrera
2019-05-21 18:49:25 -03:00
committed by Jens Schauder
parent 0f1d4970ef
commit 098842765d
4 changed files with 96 additions and 6 deletions

View File

@@ -15,13 +15,16 @@
*/
package org.springframework.data.repository.cdi;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -36,20 +39,26 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.config.CustomRepositoryImplementationDetector;
import org.springframework.data.repository.config.ImplementationLookupConfiguration;
import org.springframework.data.repository.core.NamedQueries;
import org.springframework.data.repository.core.RepositoryInformation;
import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries;
import org.springframework.data.repository.core.support.QueryCreationListener;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.data.repository.core.support.RepositoryProxyPostProcessor;
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
import org.springframework.data.repository.query.RepositoryQuery;
/**
* Unit tests for {@link CdiRepositoryBean}.
*
* @author Oliver Gierke
* @author Mark Paluch
* @author Ariel Carrera
*/
@RunWith(MockitoJUnitRunner.class)
public class CdiRepositoryBeanUnitTests {
@@ -180,6 +189,8 @@ public class CdiRepositoryBeanUnitTests {
verify(repositoryFactory).setNamedQueries(PropertiesBasedNamedQueries.EMPTY);
verify(repositoryFactory).setRepositoryBaseClass(String.class);
verify(repositoryFactory).setQueryLookupStrategyKey(Key.CREATE);
verify(repositoryFactory).addRepositoryProxyPostProcessor(DummyRepositoryProxyPostProcessor.INSTANCE);
verify(repositoryFactory).addQueryCreationListener(DummyQueryCreationListener.INSTANCE);
}
static class DummyCdiRepositoryBean<T> extends CdiRepositoryBean<T> {
@@ -228,5 +239,32 @@ public class CdiRepositoryBeanUnitTests {
public Optional<Class<?>> getRepositoryBeanClass() {
return Optional.of(String.class);
}
@Override
public List<RepositoryProxyPostProcessor> getRepositoryProxyPostProcessors() {
return Arrays.asList(DummyRepositoryProxyPostProcessor.INSTANCE);
}
@Override
public List<QueryCreationListener<?>> getQueryCreationListeners() {
return Arrays.asList(DummyQueryCreationListener.INSTANCE);
}
}
static class DummyRepositoryProxyPostProcessor implements RepositoryProxyPostProcessor {
static final DummyRepositoryProxyPostProcessor INSTANCE = new DummyRepositoryProxyPostProcessor();
@Override
public void postProcess(ProxyFactory factory, RepositoryInformation repositoryInformation) {}
}
static class DummyQueryCreationListener implements QueryCreationListener<RepositoryQuery> {
public static final DummyQueryCreationListener INSTANCE = new DummyQueryCreationListener();
@Override
public void onCreation(RepositoryQuery query) {}
}
}

View File

@@ -15,10 +15,16 @@
*/
package org.springframework.data.repository.core.support;
import static org.assertj.core.api.Assertions.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assume.*;
import static org.mockito.Mockito.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.hamcrest.Matchers.is;
import static org.junit.Assume.assumeThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.lang.reflect.Method;
@@ -37,6 +43,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.SpringVersion;
import org.springframework.dao.EmptyResultDataAccessException;
@@ -70,6 +77,7 @@ import org.springframework.util.concurrent.ListenableFuture;
*
* @author Oliver Gierke
* @author Mark Paluch
* @author Ariel Carrera
*/
@RunWith(MockitoJUnitRunner.class)
public class RepositoryFactorySupportUnitTests {
@@ -87,6 +95,8 @@ public class RepositoryFactorySupportUnitTests {
@Mock MyQueryCreationListener listener;
@Mock PlainQueryCreationListener otherListener;
@Mock RepositoryProxyPostProcessor repositoryPostProcessor;
@Before
public void setUp() {
factory = new DummyRepositoryFactory(backingRepo);
@@ -110,6 +120,16 @@ public class RepositoryFactorySupportUnitTests {
verify(otherListener, times(2)).onCreation(Mockito.any(RepositoryQuery.class));
}
@Test
public void invokesCustomRepositoryProxyPostProcessor() throws Exception {
factory.addRepositoryProxyPostProcessor(repositoryPostProcessor);
factory.getRepository(ObjectRepository.class);
verify(repositoryPostProcessor, times(1)).postProcess(Mockito.any(ProxyFactory.class),
Mockito.any(RepositoryInformation.class));
}
@Test
public void routesCallToRedeclaredMethodIntoTarget() {