Настройка Spring Data neo4j JUnit4

Признаюсь, я новичок в том, как делать вещи на Java, и я совершенно потерялся, пытаясь запустить простой модульный тест.

Я создаю библиотеку доступа к данным и хочу протестировать ее. Я использую Spring Data Neo4j 4.0.0.BUILD-SNAPSHOT, потому что мне нужно подключиться к удаленному серверу Neo4j в реальном мире.

После борьбы с ошибками весь день я нахожусь в точке, где у меня есть тестовый класс:

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan(basePackages = {"org.mystuff.data"})
@ContextConfiguration(classes={Neo4jTestConfiguration.class})
public class PersonRepositoryTest {
    @Autowired
    PersonRepository personRepository;
    protected GraphDatabaseService graphDb;

    @Before
    public void setUp() throws Exception {
        graphDb = new TestGraphDatabaseFactory().newImpermanentDatabase();
    }

    @After
    public void tearDown() {
        graphDb.shutdown();
    }

    @Test
    public void testCreatePerson() throws Exception {
        assertNotNull(personRepository);
        Person p = new Person("Test", "User");
        personRepository.save(p);
    }
}

Neo4jTestConfiguration.java

@Configuration
@EnableNeo4jRepositories(basePackages = "org.mystuff.data")
@EnableTransactionManagement
public class Neo4jTestConfiguration extends Neo4jConfiguration {
    @Bean
    public SessionFactory getSessionFactory() {
        return new SessionFactory("org.mystuff.data");
    }

    @Bean
    public Neo4jServer neo4jServer() {
        // What to return here? I want in-memory database
        return null;
    }

    @Bean
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Session getSession() throws Exception {
        return super.getSession();
    }
}

При выполнении тестов человекRepository.save() выдает и исключение «Нет области, зарегистрированной для области «сеанс». Я не знаю, нужен ли мне класс конфигурации, но мой тестовый класс не будет работать без него, потому что Spring нуждается в @ContextConfiguration, и я хочу, чтобы все прелести DI, которые Spring предоставляет (среди прочего).

Как я могу заставить свои тесты работать с Spring?


person Robin Elvin    schedule 04.06.2015    source источник


Ответы (1)


Вы можете использовать InProcessServer, которая является базой данных в памяти:

@Bean
public Neo4jServer neo4jServer() {
    return new InProcessServer();
}

Опустите область сеанса, поскольку ваш тест не выполняется в веб-контейнере. Пример: https://github.com/neo4j-examples/sdn4-cineasts/blob/4.0-RC1/src/test/java/org/neo4j/cineasts/PersistenceContext.java

Для этого потребуются зависимости, как описано в этом вопросе: Spring Data Neo4j 4.0 .0.M1 Тестовая конфигурация

В вашем тестовом классе PersonRepositoryTest вам не нужно создавать экземпляр базы данных, ваши тесты будут выполняться с тем же InProcessServer. Вот пример: https://github.com/neo4j-examples/sdn4-cineasts/blob/4.0-RC1/src/test/java/org/neo4j/cineasts/domain/DomainTest.java

person Luanne    schedule 05.06.2015
comment
Кажется, у меня нет InProcessServer. Откуда это? - person Robin Elvin; 05.06.2015
comment
Нашел - мне нужен spring-data-neo4j в определениях Gradle testCompile - person Robin Elvin; 05.06.2015
comment
Теперь это работает блестяще, спасибо. Пример проекта является отличным источником информации и действительно помогает. - person Robin Elvin; 05.06.2015
comment
Добро пожаловать. Еще пара примеров sdn4* есть на github.com/neo4j-examples. - person Luanne; 05.06.2015