2016-03-14 1 views
0

Я создаю приложение Spring с использованием базы данных Neo4j. У меня есть некоторые сервисы, которые реализуют базовые функции базы данных, такие как сохранение пользователя или поиск пользователя по его имени пользователя. Поскольку я реализовал некоторые ограничения, например, что невозможно удалить не существующего пользователя, я хочу проверить свою службу. Мое желание будет иметь тест, который создает временный графический файл Neo4j, как описано в http://neo4j.com/docs/stable/tutorials-java-unit-testing.html. Но, кроме того, я хочу, чтобы автосервис мой UserService в тест, выполнять некоторые операции во временной базе данных и снова уничтожать временную базу данных. Я ожидаю, что смогу решить эту проблему с помощью TestConfigurations, но поскольку я не испытываю опыта Spring или Neo4j, все не так просто.Временная база данных Neo4j для тестирования сервисов

У меня есть следующая конфигурация

@Configuration 
@EnableNeo4jRepositories(basePackages = "de.myapp") 
@EnableTransactionManagement 
public class UserTestConfiguration extends Neo4jConfiguration{ 

    @Bean 
    public UserService userService() { 
    return new UserBean(); 
    } 

    @Bean 
    public Neo4jServer neo4jServer() { 
    //This is probably wrong since i really want to connect to the impermanent db 
    return new RemoteServer("http://localhost:7474"); 
    } 

    @Bean 
    public SessionFactory getSessionFactory() { 
    return new SessionFactory("de.myapp"); 
    } 
} 

И следующий тест-класс

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=TSUserTestConfiguration.class) 
public class TSUserBeanTest { 

    private GraphDatabaseService graphDb; 

    @Autowired 
    private TSUserService userService; 

    @Before 
    public void prepareTestDatabase() { 
    graphDb = new TestGraphDatabaseFactory().newImpermanentDatabase(); 
    } 

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

    @Test 
    public void createUserTest() { 
    TSUser user = new TSUser("TestUser", "TestEmail"); 
    //This should create the user in the impermanent db 
    userService.persistUser(user); 
    //assert stuff here 
    } 
} 

Однако я получаю NullPointer исключения для graphDB в разрушающем и я даже не уверен, что если Я на правильном пути. Может быть, у кого-то есть пример для этого сценария? Даже лучший способ интеграции - проверка моего сервиса на временном db приветствуется.

Спасибо и привет Urr4

+0

Просьба указать трассировку стека –

ответ

0

Я использовал следующие конфигурации для тестирования

@Configuration 
@ComponentScan("my.services") 
@EnableNeo4jRepositories("my.repos") 
public class MyTestingConfiguration extends Neo4jConfiguration { 

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

    @Override 
    public SessionFactory getSessionFactory() { 
    return new SessionFactory("de.tsbros"); 
    } 
} 

И следующий класс для тестирования

@ContextConfiguration(classes = {MyTestingConfiguration.class}) 
@RunWith(SpringJUnit4ClassRunner.class) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
public class TSUserBeanTest { 
    @Autowired 
    private MyService myService; 

    //testing here 
} 

с помощью следующих зависимостей

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-neo4j</artifactId> 
    <version>${sdn.version}</version> 
    <type>test-jar</type> 
</dependency> 

<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-kernel</artifactId> 
    <version>${neo4j.version}</version> 
    <type>test-jar</type> 
</dependency> 

<dependency> 
    <groupId>org.neo4j.app</groupId> 
    <artifactId>neo4j-server</artifactId> 
    <version>${neo4j.version}</version> 
    <type>test-jar</type> 
</dependency> 

<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-ogm</artifactId> 
    <version>${neo4j-ogm.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.neo4j.test</groupId> 
    <artifactId>neo4j-harness</artifactId> 
    <version>${neo4j.version}</version> 
    <scope>test</scope> 
</dependency> 

Все, как описано here работает как очарование.

+0

К сожалению, это решение больше не поможет. «В SDN 4.1 InProcessServer устарел». http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#testing – Plutoz

+0

Спасибо за головы. Я буду помнить, когда я обновляюсь. – Urr4

3

Похоже, вы используете SDN 4.x. - какая версия?

SDN 4,0 RELEASE

Вместо RemoteServer, вы будете использовать InProcessServer, который внутренне запускает новый экземпляр CommunityNeoServer на доступном местном порту. Он также будет выключен, поэтому он идеально подходит и рекомендуется для тестирования. В конфигурации, используйте это вместо RemoteServer -

@Bean общественного Neo4jServer neo4jServer() { вернуть новый InProcessServer(); }

Необходимые зависимости задокументированы в reference guide. Дальнейшее чтение, раздел теста в этом blog post. не

SDN 4,1 M1

InProcessServer больше недоступен, и вместо этого вы хотите использовать встроенный драйвер, который будет установлены для вас непостоянных баз данных графа. ogm.properties для непостоянного встроенного магазина должен

, содержа-
driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver 

Зависимости, необходимые задокументированы в reference guide. Пример обновления ваших тестов для использования SDN 4.1 можно найти here.

+0

Я собираюсь попробовать это позже, но на первый взгляд это выглядит действительно хорошо, спасибо! – Urr4

+0

Прохладный, если он работает, пожалуйста, примите ответ. Если нет, мы поможем :-) – Luanne

+0

Я попробовал и в настоящее время не могу заставить его работать. Я попытался добавить зависимости так же, как в блоге, который вы опубликовали, но он строит тест с PersistenceContext ContextConfguration, он всегда получает сообщение «Не удалось загрузить исключение ApplicationContext», сообщая мне об этом «Не удалось создать экземпляр [javax.persistence.PersistenceContext]: указанный класс интерфейс ". – Urr4