Mocks, возвращающие mocks: Mocking объекты neo4j (базы данных) для модульного тестирования логики домена - PullRequest
2 голосов
/ 30 ноября 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Я использую 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>

в противном случае impermanentGraphDatabase будет недоступен.

наконец, я мог бы использовать чистый граф 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 () {
          ...
    }
}

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

2 голосов
/ 30 ноября 2011

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

  1. либо иметь прибор, который заполняет новый БД данными;
  2. имеет настройку тестовой базы данных, которая используется каждый раз, когда вы запускаете тесты (в этом случае вы должны найти способ отката ваших изменений или всегда начинать с известного состояния)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...