diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 4a82c87b487..5bf0cf63ed3 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -5710,6 +5710,59 @@ A list of the auto-configuration that is enabled by `@DataMongoTest` can be +[[boot-features-testing-spring-boot-applications-testing-autoconfigured-neo4j-test]] +==== Auto-configured Data Neo4j tests +`@DataNeo4jTest` can be used if you want to test Neo4j applications. By default, it will +use an in-memory embedded Neo4j (if the embedded driver is available), scan for +`@NodeEntity` classes and configure Spring Data Neo4j repositories. Regular `@Component` +beans will not be loaded into the `ApplicationContext`: + +[source,java,indent=0] +---- + import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; + import org.springframework.test.context.junit4.SpringRunner; + + @RunWith(SpringRunner.class) + @DataNeo4jTest + public class ExampleDataNeo4jTests { + + @Autowired + private YourRepository repository; + + // + } +---- + +Data Neo4j tests are transactional and rollback at the end of each test by default, +see the {spring-reference}#testcontext-tx-enabling-transactions[relevant section] in the +Spring Reference Documentation for more details. If that's not what you want, you can +disable transaction management for a test or for the whole class as follows: + +[source,java,indent=0] +---- + import org.junit.Test; + import org.junit.runner.RunWith; + import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; + import org.springframework.test.context.junit4.SpringRunner; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + @RunWith(SpringRunner.class) + @DataNeo4jTest + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public class ExampleNonTransactionalTests { + + } +---- + + +A list of the auto-configuration that is enabled by `@DataNeo4jTest` can be +<>. + + + [[boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-client]] ==== Auto-configured REST clients The `@RestClientTest` annotation can be used if you want to test REST clients. By default diff --git a/spring-boot-test-autoconfigure/pom.xml b/spring-boot-test-autoconfigure/pom.xml index 7c51013c0be..d65d49ced96 100644 --- a/spring-boot-test-autoconfigure/pom.xml +++ b/spring-boot-test-autoconfigure/pom.xml @@ -217,11 +217,5 @@ de.flapdoodle.embed.mongo test - - org.springframework.boot - spring-boot - test-jar - test - diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTest.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTest.java index 37650a922b3..81ebe31308a 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTest.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTest.java @@ -43,9 +43,11 @@ import org.springframework.transaction.annotation.Transactional; * configuration relevant to Neo4j tests. *

* By default, tests annotated with {@code @DataNeo4jTest} will use an embedded in-memory - * Neo4j process (if available). + * Neo4j process (if available). They will also be transactional with the usual + * test-related semantics (i.e. rollback by default). * * @author Eddú Meléndez + * @author Stephane Nicoll * @since 2.0.0 */ @Target(ElementType.TYPE) diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTypeExcludeFilter.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTypeExcludeFilter.java index a19ca74bd50..5b0ee1cf7f1 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTypeExcludeFilter.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTypeExcludeFilter.java @@ -28,7 +28,6 @@ import org.springframework.core.annotation.AnnotatedElementUtils; * {@link TypeExcludeFilter} for {@link DataNeo4jTest @DataNeo4jTest}. * * @author Eddú Meléndez - * @since 2.0.0 */ class DataNeo4jTypeExcludeFilter extends AnnotationCustomizableTypeExcludeFilter { diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java index 6941fcc7ff2..5883fcb8b33 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java @@ -24,16 +24,16 @@ import org.neo4j.ogm.session.Session; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.neo4j.Neo4jTestServer; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; /** - * Sample test for {@link DataNeo4jTest @DataNeo4jTest} + * Integration test for {@link DataNeo4jTest}. * * @author Eddú Meléndez + * @author Stephane Nicoll */ @RunWith(SpringRunner.class) @DataNeo4jTest @@ -41,7 +41,7 @@ public class DataNeo4jTestIntegrationTests { @Rule public Neo4jTestServer server = new Neo4jTestServer( - new String[]{"org.springframework.boot.test.autoconfigure.data.neo4j"}); + new String[] { "org.springframework.boot.test.autoconfigure.data.neo4j" }); @Rule public ExpectedException thrown = ExpectedException.none(); @@ -59,8 +59,9 @@ public class DataNeo4jTestIntegrationTests { public void testRepository() { ExampleGraph exampleGraph = new ExampleGraph(); exampleGraph.setDescription("Look, new @DataNeo4jTest!"); - exampleGraph = this.exampleRepository.save(exampleGraph); - assertThat(exampleGraph.getId()).isNotNull(); + assertThat(exampleGraph.getId()).isNull(); + ExampleGraph savedGraph = this.exampleRepository.save(exampleGraph); + assertThat(savedGraph.getId()).isNotNull(); assertThat(this.session.countEntitiesOfType(ExampleGraph.class)).isEqualTo(1); } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java index 4851a422c19..d0ab9e750be 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java @@ -21,7 +21,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.neo4j.Neo4jTestServer; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Service; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleGraph.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleGraph.java index 43753d80673..55382d540ae 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleGraph.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleGraph.java @@ -49,4 +49,5 @@ public class ExampleGraph { public void setDescription(String description) { this.description = description; } + } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleRepository.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleRepository.java index 7c8b464dd1c..bf3fb05b26a 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleRepository.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleRepository.java @@ -16,12 +16,12 @@ package org.springframework.boot.test.autoconfigure.data.neo4j; -import org.springframework.data.neo4j.repository.GraphRepository; +import org.springframework.data.neo4j.repository.Neo4jRepository; /** * Example repository used with {@link DataNeo4jTest} tests. * * @author Eddú Meléndez */ -public interface ExampleRepository extends GraphRepository { +public interface ExampleRepository extends Neo4jRepository { } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleService.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleService.java index c7e2e7ee610..4472f1da699 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleService.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/ExampleService.java @@ -37,4 +37,5 @@ public class ExampleService { public boolean hasNode(Class clazz) { return this.session.countEntitiesOfType(clazz) == 1; } + } diff --git a/spring-boot/src/test/java/org/springframework/boot/neo4j/Neo4jTestServer.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/Neo4jTestServer.java similarity index 86% rename from spring-boot/src/test/java/org/springframework/boot/neo4j/Neo4jTestServer.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/Neo4jTestServer.java index 0c47a738748..9f2636a735e 100644 --- a/spring-boot/src/test/java/org/springframework/boot/neo4j/Neo4jTestServer.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/Neo4jTestServer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.neo4j; +package org.springframework.boot.test.autoconfigure.data.neo4j; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -23,13 +23,14 @@ import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.neo4j.ogm.config.Configuration; -import org.neo4j.ogm.config.DriverConfiguration; import org.neo4j.ogm.session.SessionFactory; /** - * {@link TestRule} for working with an optional Neo4j server. + * {@link TestRule} for working with an optional Neo4j server running on localhost. Make + * sure to disable authentication if you haven't done so already. * * @author Eddú Meléndez + * @author Stephane Nicoll */ public class Neo4jTestServer implements TestRule { @@ -55,12 +56,13 @@ public class Neo4jTestServer implements TestRule { } } - private SessionFactory createSessionFactory() { - Configuration configuration = new Configuration(); - DriverConfiguration driverConfiguration = configuration.driverConfiguration(); - driverConfiguration.setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver"); - driverConfiguration.setURI("http://localhost:7474"); + public SessionFactory getSessionFactory() { + return this.sessionFactory; + } + private SessionFactory createSessionFactory() { + Configuration configuration = new Configuration.Builder() + .uri("bolt://localhost:7687").build(); SessionFactory sessionFactory = new SessionFactory(configuration, this.packages); testConnection(sessionFactory); return sessionFactory; diff --git a/spring-boot/src/test/java/org/springframework/boot/neo4j/package-info.java b/spring-boot/src/test/java/org/springframework/boot/neo4j/package-info.java deleted file mode 100644 index 15ccefe4ae7..00000000000 --- a/spring-boot/src/test/java/org/springframework/boot/neo4j/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012-2017 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 - * - * http://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. - */ - -/** - * Neo4j support classes - */ -package org.springframework.boot.neo4j;