2 votes

Comment simuler les services Grails dans les tests unitaires de routes de production Camel

Je dois écrire des tests unitaires pour les routes de production dans Grails qui utilisent des services référencés par le composant Bean de Camel. Mon exigence est de ne ni changer ni copier les routes existantes dans les tests.

Le problème est de simuler d'une manière ou d'une autre le service bean et de l'ajouter au registre de Camel.

J'ai réussi à le faire en utilisant la méthode 'bind' sur l'objet 'context.registry.registry'. Y a-t-il une fonctionnalité pour le faire de manière plus sûre? Version de Camel: 2.10, Grails 2.1

La route est la suivante:

from('direct:validate').to('bean:camelService?method=echo')

CamelService est juste une classe simple:

package com

class CamelService {
    def echo(text) {
        println "text=$text"
        text
    }
}

Le test est le suivant (la route a été copiée uniquement pour simplifier la question):

package com

import grails.test.mixin.*
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.test.junit4.CamelTestSupport

@TestFor(CamelService)
class RouteTests extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from('direct:validate').to('bean:camelService?method=echo')
            }
        };
    }

    void testMockBean() throws Exception {
        context.registry.registry.bind 'camelService', service
        def result = template.requestBody('direct:validate', 'message')
        assert result != null
        assert result == 'message'
    }
}

1voto

Claus Ibsen Points 16878

Camel vous permet de brancher n'importe quel registre personnalisé que vous voulez, et par défaut il utilise un registre basé sur Jndi, c'est pourquoi vous pouvez lier un service avec l'exemple de code. Une alternative est d'utiliser un SimpleRegistry qui est simplement une Map, donc vous pouvez mettre un service dans le registre en utilisant la méthode put de la Map. Vous devriez alors surcharger la méthode createCamelContext de la classe CamelTestSupport et passer le SimpleRegistry au constructeur de DefaultCamelContext.

Quoi qu'il en soit, votre code est sûr tant que vous utilisez la classe CamelTestSupport non-Spring, car elle utilise le registre basé sur JNDI par défaut. Si vous utilisez CamelSpringTestSupport, alors c'est un registre basé sur Spring, et vous devrez utiliser le contexte d'application Spring pour ajouter votre bean à celui-ci.

0voto

cexbrayat Points 9128

Vous pouvez injecter vos composants en utilisant CamelSpringtestSupport plutôt que CamelTestSupport comme classe de base.

Lire la documentation sur Spring Test vous aidera certainement, et vous pourriez trouver intéressant d'utiliser des mocks dans vos tests.

Quoi qu'il en soit, vous pouvez construire un contexte personnalisé pour votre test, contenant la déclaration de vos beans et le charger dans le test.

public class RouteTests extends CamelSpringTestSupport {

    @Override
    protected AbstractApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("route-test-context.xml");
    }

    @Test
    public void testMockBean(){
         //...
    }
}

route-test-context.xml

          com

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X