Mocks revenant mocks: Mocking Neo4j (base de données) des objets pour les tests unitaires de la logique de domaine

StackOverflow https://stackoverflow.com/questions/8321414

  •  26-10-2019
  •  | 
  •  

Question

Je suis logique de domaine de tests unitaires et des objets de domaine soutenus par une base de données Neo4j. La plupart de ces tests doivent se moquer de la GraphDatabaseService de Neo4j, divers Nodes et divers Relationships. Certaines des méthodes moquaient retourner ces objets chinés. Par exemple, un retour de l'appel de getReferenceNode () un nœud moqué ou un appel renvoie getSingleRelationship () une relation moqué dont getEndNode () retourne à son tour un nœud moqué.

Je suis préoccupé par le nombre de simulacres de retour se moque de retour se moque. En général, ce n'est pas recommandé. Il complique certainement la configuration de test et conduit à des tests très fragiles, car tant de couches de fonctionnalité Neo4j besoin d'être moquaient.

Y at-il un moyen d'éviter ce domaine lors de la sauvegarde Neo4j-tests unitaires logique?

Était-ce utile?

La solution

Vous pouvez essayer d'utiliser une base de données temporaire - qui est créé / rincée à chaque fois. Dans le cas où vous avez besoin de données de l'échantillon alors vous pouvez:

  1. soit avoir un dispositif qui remplit la nouvelle db avec des données;
  2. ont une configuration db de test qui est utilisé chaque fois que vous exécutez des tests (dans ce cas, vous devez trouver un moyen de rollback vos modifications ou toujours à partir de l'état connu)

Autres conseils

J'utilise Maven, source de données et printemps test unitaire mon application à l'aide du ImpermanentGraphDatabase. Comme il était très difficile de le mettre en place ici est ce que je l'ai fait:

dans mon applicationContext.xml J'initialisés le 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>

dans mon pom.xml je devais ajouter des tests-noyau:

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

sinon le impermanentGraphDatabase ne sera pas disponible.

enfin je pouvais utiliser un graphique propre 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 () {
          ...
    }
}

Je trouve que la configuration est beaucoup plus rapide que d'utiliser la voie normale. tout garder en mémoire semble payer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top