Имитаторы, возвращающие моки: имитация объектов neo4j (база данных) для модульного тестирования логики предметной области

Я модульно тестирую логику домена и объекты домена, поддерживаемые базой данных neo4j. Большинство из этих тестов должны имитировать neo4j GraphDatabaseService, различные Nodes и различные Relationships. Некоторые из фиктивных методов возвращают эти фиктивные объекты. Например, вызов getReferenceNode() возвращает фиктивный Node, а вызов getSingleRelationship() возвращает фиктивное отношение, чье getEndNode(), в свою очередь, возвращает фиктивный Node.

Меня беспокоит количество насмешек, возвращающих насмешки, возвращающих насмешки. Обычно это не рекомендуется. Это, безусловно, усложняет тестовую настройку и приводит к довольно хрупким тестам, потому что нужно имитировать так много слоев функциональности neo4j.

Есть ли способ избежать этого при модульном тестировании логики домена, поддерживаемой neo4j?


person David B.    schedule 30.11.2011    source источник


Ответы (2)


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

  1. либо иметь приспособление, которое заполняет новую базу данных данными;
  2. иметь тестовую настройку базы данных, которая используется каждый раз, когда вы запускаете тесты (в этом случае вы должны найти способ отката ваших изменений или всегда начинать с известного состояния)
person Alex Popescu    schedule 30.11.2011
comment
Есть готовая база данных, которая сделает это за вас. Используйте ImpermanentGraphDatabase, которая предназначена только для памяти и всегда чиста при создании новой. Это то, что мы (команда Neo) используем для тестирования многих наших собственных вещей. - person Andres; 30.11.2011
comment
Я использую ImpermanentGraphDatabase для интеграционных/приемочных тестов. Возможно, это все еще путь для модульных тестов. Мне нужно будет посмотреть на стоимость времени выполнения для этой установки и демонтажа. - person David B.; 30.11.2011
comment
Есть ли способ получить к этому доступ из Nodejs - только через REST API? - person Michael Cole; 05.11.2014

Я использую источник данных Maven, Spring и модульное тестирование своего приложения с использованием базы данных ImpermanentGraphDatabase. Так как это было довольно сложно настроить, вот что я сделал:

в моем applicationContext.xml я инициализировал graphDatabaseService:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
             http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
    default-lazy-init="true">


    <neo4j:config graphDatabaseService="graphDatabaseService"/>
    <!--  use in memory graph database -->
    <bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase"/>

</beans>

в моем pom.xml мне пришлось добавить тесты ядра:

    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-kernel</artifactId>
        <version>1.6</version>
        <classifier>tests</classifier>
        <scope>test</scope>
    </dependency>

в противном случае непостоянная база данных GraphDatabase будет недоступна.

наконец, я мог бы использовать чистый граф db evrytime:

public class MyNeo4JTest extends TestCase {

    protected ApplicationContext ctx;
    protected GraphDatabaseService gds;

    @Before
    public void setUp() throws Exception {

        // test-data
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        gds = ctx.getBean(GraphDatabaseService.class);
    }

    @Test
    public void testUser () {
          ...
    }
}

Я считаю, что установка НАМНОГО быстрее, чем при использовании обычного способа. хранение всего в памяти, кажется, окупается

person Niko    schedule 07.02.2012