2

Camel Bean コンポーネントによって参照されるサービスを使用する Grails のプロダクション ルートのユニット テストを作成する必要があります。私の要件は、テストで既存のルートを変更したりコピーしたりすることではありません。

問題は、どういうわけかサービス Bean をモックして、Camel レジストリに追加することです。

「context.registry.registry」オブジェクトで「bind」メソッドを使用してこれを行うことができました。より安全な方法でそれを行う機能はありますか? Camel のバージョンは 2.10、Grails は 2.1

ルートは次のとおりです。

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

CamelService は単純なクラスです。

package com

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

テストは次のとおりです(質問を簡単にするためにのみルートをコピーしました):

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'
    }
}
4

2 に答える 2

1

Camel では、任意のカスタム レジストリをプラグインすることができ、すぐに使用できる Jndi ベースのレジストリが使用されるため、コード例を使用してサービスをそれにバインドできます。別の方法として、単なる Map である SimpleRegistry を使用することもできます。これにより、Map の put メソッドを使用してレジストリにサービスを配置できます。次に、CamelTestSupport クラスの createCamelContext メソッドをオーバーライドし、SimpleRegistry を DefaultCamelContext のコンストラクターに渡す必要があります。

とにかく、Spring 以外の CamelTestSupport クラスを使用している限り、コードは安全です。これは、そのままで JNDI ベースのレジストリを使用するためです。CamelSpringTestSupport を使用する場合は、Spring ベースのレジストリであり、Spring アプリ コンテキストを使用して Bean を追加する必要があります。

于 2012-08-28T05:32:46.800 に答える
0

基本クラスとして CamelTestSupport ではなく CamelSpringtestSupport を使用してコンポーネントを注入できます。

Spring Testのドキュメントを読むことは確かに役に立ちます。また、テストでモックを使用することに興味があるかもしれません。

とにかく、Bean の宣言を含むテスト用のカスタム コンテキストを作成し、それをテストにロードすることができます。

public class RouteTests  extends CamelSpringTestSupport {

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

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

route-test-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://camel.apache.org/schema/cxf" xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://camel.apache.org/schema/spring 
     http://camel.apache.org/schema/spring/camel-spring.xsd">

     <bean id="service" ref="com.CamelService"/>
     <camelContext xmlns="http://camel.apache.org/schema/spring">
          <package>com</package>
     </camelContext>
</beans>
于 2012-08-27T14:34:44.357 に答える