diff --git a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java index f51a535ee..0980aaa5f 100644 --- a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java +++ b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java @@ -29,6 +29,7 @@ import org.springframework.util.ReflectionUtils; * information. * * @author Oliver Gierke + * @author Thomas Darimont * @since 1.6 */ class ReflectionRepositoryInvoker implements CrudInvoker { @@ -72,6 +73,6 @@ class ReflectionRepositoryInvoker implements CrudInvoker { @Override @SuppressWarnings("unchecked") public T invokeFindOne(Serializable id) { - return (T) ReflectionUtils.invokeMethod(methods.getFindOneMethod(), id); + return (T) ReflectionUtils.invokeMethod(methods.getFindOneMethod(), repository, id); } } diff --git a/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java b/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java index 6459e6595..4dc23d48a 100644 --- a/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java @@ -23,7 +23,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.core.CrudInvoker; import org.springframework.data.repository.core.CrudMethods; /** @@ -34,7 +35,7 @@ import org.springframework.data.repository.core.CrudMethods; @RunWith(MockitoJUnitRunner.class) public class ReflectionRepositoryInvokerUnitTests { - @Mock Repository repo; + @Mock CrudRepository repo; @Mock CrudMethods methods; @Test @@ -72,4 +73,37 @@ public class ReflectionRepositoryInvokerUnitTests { new ReflectionRepositoryInvoker(repo, methods); } + + /** + * @see DATACMNS-410 + */ + @Test + public void invokesFindOneCorrectly() throws Exception { + + when(methods.hasFindOneMethod()).thenReturn(true); + when(methods.hasSaveMethod()).thenReturn(true); + when(methods.getFindOneMethod()).thenReturn(CrudRepository.class.getMethod("findOne", Serializable.class)); + + CrudInvoker invoker = new ReflectionRepositoryInvoker(repo, methods); + invoker.invokeFindOne(1L); + + verify(repo, times(1)).findOne(1L); + } + + /** + * @see DATACMNS-410 + */ + @Test + public void invokesSaveCorrectly() throws Exception { + + when(methods.hasFindOneMethod()).thenReturn(true); + when(methods.hasSaveMethod()).thenReturn(true); + when(methods.getSaveMethod()).thenReturn(CrudRepository.class.getMethod("save", Object.class)); + + CrudInvoker invoker = new ReflectionRepositoryInvoker(repo, methods); + Object object = new Object(); + invoker.invokeSave(object); + + verify(repo, times(1)).save(object); + } } diff --git a/src/test/java/org/springframework/data/repository/support/RepositoriesIntegrationTests.java b/src/test/java/org/springframework/data/repository/support/RepositoriesIntegrationTests.java index c3a244903..fce9fef7e 100644 --- a/src/test/java/org/springframework/data/repository/support/RepositoriesIntegrationTests.java +++ b/src/test/java/org/springframework/data/repository/support/RepositoriesIntegrationTests.java @@ -21,12 +21,14 @@ import static org.mockito.Mockito.*; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.Repository; +import org.springframework.data.repository.core.CrudInvoker; import org.springframework.data.repository.core.support.DummyRepositoryFactoryBean; import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; import org.springframework.test.context.ContextConfiguration; @@ -36,6 +38,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Integration tests for {@link Repositories}. * * @author Oliver Gierke + * @author Thomas Darimont */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @@ -61,16 +64,24 @@ public class RepositoriesIntegrationTests { } @Bean - public RepositoryFactoryBeanSupport, Product, Long> productRepositoryFactory() { + public RepositoryFactoryBeanSupport, Product, Long> productRepositoryFactory( + ProductRepository productRepository) { DummyRepositoryFactoryBean, Product, Long> factory = new DummyRepositoryFactoryBean, Product, Long>(); factory.setRepositoryInterface(ProductRepository.class); + factory.setCustomImplementation(productRepository); return factory; } + + @Bean + public ProductRepository productRepository() { + return mock(ProductRepository.class); + } } @Autowired Repositories repositories; + @Autowired ProductRepository productRepository; @Test public void detectsRepositories() { @@ -98,6 +109,21 @@ public class RepositoriesIntegrationTests { assertThat(repositories.getPersistentEntity(user.getClass()), is(notNullValue())); } + /** + * @see DATACMNS-410 + */ + @Test + public void findOneShouldDelegateToAppropriateRepository() { + + Mockito.reset(productRepository); + Product product = new Product(); + when(productRepository.findOne(4711L)).thenReturn(product); + + CrudInvoker crudInvoker = repositories.getCrudInvoker(Product.class); + + assertThat(crudInvoker.invokeFindOne(4711L), is(product)); + } + static class User { } @@ -106,9 +132,9 @@ public class RepositoriesIntegrationTests { } - static class Product {} + public static class Product {} - interface ProductRepository extends Repository { + public static interface ProductRepository extends Repository { Product findOne(Long id);