繁体   English   中英

使用cametestsupport进行骆驼单元测试,模板始终为null

[英]camel unit test with cametestsupport, template is always null

我正在用骆驼做一个简单的单元测试。 我要做的就是从文件中的json中读取一个json,并将其发送到java类进行验证-这是我尝试测试的方法。 无论我做什么,模板(用于sendBody(json)的模板始终为null。这是我的代码

public class RouteTests extends CamelTestSupport {

    @EndpointInject(uri = "mock:result")
    protected MockEndpoint resultEndpoint;

    @Produce(uri = "direct:start")
    protected ProducerTemplate template;

    @Autowired
    JSONObject testJson;

    @Before
    public void setUp() throws Exception {
        try {
            final ObjectMapper objectmapper = new ObjectMapper();
            final ClassLoader loader = Thread.currentThread().getContextClassLoader();
            final InputStream stream = loader.getResourceAsStream("test.json");
            testJson = new JSONObject ((Map)objectmapper.readValue(stream, Map.class));
            //start camel
            context = new DefaultCamelContext();
            context.addRoutes(createRouteBuilder());
            context.start();
        } catch (IOException e) {
        }
    }

    @Test
    public void testSendMatchingMessage() throws Exception {
//        resultEndpoint.expectedBodiesReceived(expectedBody);
        resultEndpoint = getMockEndpoint("mock:result");
//        resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);
        resultEndpoint.expectedMessageCount(1);
        template.sendBody("direct:start", testJson);
        resultEndpoint.assertIsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("direct:start")
                        .filter().method(ValidationProcessor.class, "validate")
                        .to("mock:result");
            }
        };
    }

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("ValidationProcessor", new ValidationProcessor",());

        return jndi;
    }
}

我遇到的问题:1.最初,结果终点也始终为null。 (我使用http://svn.apache.org/repos/asf/camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java作为参考)。 然后我必须做一个明确的

resultEndpoint = getMockEndpoint("mock:result");

解决这个问题。

  1. 然后我读到我必须重写createRegistry,但是我不知道如何绑定。 我只是使用了验证类的名称,但我不知道这是否正确。

但是模板始终为空。 NPE在

template.sendBody("direct:start", testJson);

我一直在努力解决这个问题,终于向你们寻求帮助。 真的很累:(

如有必要,还请给我指出一些阅读材料。 apache camel docs链接到的参考代码甚至没有我在setUp方法中所做的骆驼的开始。 甚至不确定是否需要。 请帮忙 !

安南斯

尝试按以下方式从骆驼上下文创建生产者模板:

public class RouteTests extends CamelTestSupport {

@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;

protected ProducerTemplate template;

@Autowired
JSONObject testJson;

@Before
public void setUp() throws Exception {
    try {
        final ObjectMapper objectmapper = new ObjectMapper();
        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
        final InputStream stream = loader.getResourceAsStream("test.json");
        testJson = new JSONObject ((Map)objectmapper.readValue(stream, Map.class));
        //start camel
        context = new DefaultCamelContext();
        context.addRoutes(createRouteBuilder());
        context.start();
        template = context.createProducerTemplate();
    } catch (IOException e) {
    }
}

@Test
public void testSendMatchingMessage() throws Exception {
    //resultEndpoint.expectedBodiesReceived(expectedBody);
    resultEndpoint = getMockEndpoint("mock:result");
    //resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);
    resultEndpoint.expectedMessageCount(1);
    template.sendBody("direct:start", testJson);
    resultEndpoint.assertIsSatisfied();
}

@Override
protected RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from("direct:start")
                    .filter().method(ValidationProcessor.class, "validate")
                    .to("mock:result");
        }
    };
}

@Override
protected JndiRegistry createRegistry() throws Exception {
    JndiRegistry jndi = super.createRegistry();
    jndi.bind("ValidationProcessor", new ValidationProcessor());

    return jndi;
}

}

因此,在您的setUp()中只需添加:

template = context.createProducerTemplate();

并删除@Produce(uri =“ direct:start”)

我认为您已经错过了CamelTestSupport为您提供的许多真正有用的东西。 它具有自己的setUp方法,您应该重写该方法。 我相信您的测试应该看起来像这样:

public class RouteTests extends CamelTestSupport {

    private JSONObject testJson;

    @Override
    public void setUp() throws Exception {
        // REALLY important to call super
        super.setUp();

        ObjectMapper objectmapper = new ObjectMapper();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        InputStream stream = loader.getResourceAsStream("test.json");
        testJson = new JSONObject(objectmapper.readValue(stream, Map.class));
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            @Override
            public void configure() {
                from("direct:start")
                        .filter().method(ValidationProcessor.class, "validate")
                        .to("mock:result");
            }
        };
    }

    @Test
    public void testSendMatchingMessage() throws Exception {
        MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
        resultEndpoint.expectedMessageCount(1);
        template.sendBody("direct:start", testJson);
        resultEndpoint.assertIsSatisfied();
    }
}

实际上,我将完全删除setUp的覆盖并将测试数据的读取放入测试方法本身。 这样就可以清楚地知道数据的用途,并且可以消除testJson字段。

public class RouteTests extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            @Override
            public void configure() {
                from("direct:start")
                        .filter().method(ValidationProcessor.class, "validate")
                        .to("mock:result");
            }
        };
    }

    @Test
    public void testSendMatchingMessage() throws Exception {
        ObjectMapper objectmapper = new ObjectMapper();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        InputStream stream = loader.getResourceAsStream("test.json");
        JSONObject testJson = new JSONObject(objectmapper.readValue(stream, Map.class));

        MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
        resultEndpoint.expectedMessageCount(1);
        template.sendBody("direct:start", testJson);
        resultEndpoint.assertIsSatisfied();
    }
}

在那里,要简单得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM