我用Apache Camel实现了一个消息转换器模式,使用来自RESTfulendpoint的消息,并将它们发送到AMQPendpoint。
随附的应用程序基于Spring启动,因此我使用Camel的“Spring启动”组件来集成这两个框架。正如此Spring启动链接中的文档所建议的那样,我正在扩展 RouteBuilder
的@Configuration
注释类中实现我的 Camel 路由:
@Component
public class MyRestToAmqpRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("jetty:http://my-restful-url")
.process(exchange -> {
// convert the message body from JSON to XML, take some
// incoming header values and put them in the outgoing
// body, etc...
}).to("rabbitmq://my-rabbitmq-url");
}
}
我的问题是,在不需要实际的RESTfulendpoint或配置的RabbitMQ代理的情况下,如何对这个翻译进行单元测试?我读过很多网上的例子,还有《骆驼行动》这本书...似乎单元测试Camel route的典型方法是将该路由剪切粘贴到单元测试中,并用“< code>mock:whatever”替换一个或多个endpointURL。
我想那是可行的...但是它非常脆弱,当有人在没有更新单元测试的情况下修改了真正的代码时,您的测试套件不会识别出来。
我试着用模拟来调整一些基于Spring的单元测试示例,如下所示:
@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
public class MyRestToAmqpRouterTest extends AbstractJUnit4SpringContextTests {
@Produce(uri = "jetty:http://my-restful-url")
private ProducerTemplate fakeRest;
@EndpointInject(uri = "rabbitmq://my-rabbit-url")
private MockEndpoint fakeRabbit;
@Test
@DirtiesContext
public void testRouter() throws InterruptedException {
fakeRabbit.expectedMessageCount(1);
fakeRest.sendBodyAndHeader("", "header-1", "some value");
fakeRabbit.assertIsSatisfied();
}
}
我希望骆驼能从单元测试中获取这些endpointURL,并将它们注册为模拟...然后在真实代码尝试使用这些 URL 时使用模拟而不是真正的终结点。
但是,我不确定这是否可能。当我在单元测试中使用真实 URL 时,我得到的是非法描述异常
,因为您显然无法将“真实”endpoint URL 注入到 MockEndpoint
实例中(只有以“mock:
”为前缀的 URL)。
当我使用“<代码>模拟:...“在我的单元测试中的endpointURL,那么它是无用的,因为没有任何东西将它与被测试类中真正的endpointURL联系起来。以便真正的endpointURL永远不会被覆盖。当执行真正的代码时,它只是像平常一样使用真正的endpoint(目标是能够在没有对RabbitMQ的外部依赖的情况下进行测试)。
我是不是遗漏了一些非常基本的东西?单元测试似乎有办法将假路由注入到这样的类中,这样被测试的代码就可以在没有意识到的情况下从真实endpoint切换到模拟endpoint。或者,我想我可以重构我的代码,这样匿名处理器就可以提升到一个独立的类……然后我可以独立于路由单元测试它的翻译逻辑。但这似乎是一个不完整的测试。
一些指示你可以做什么。
你可以再读一次骆驼的书关于测试,并注意使用建议与
还有< code > mockEndpointsAndSkip
您还可以使用stub
组件
或者在路由中使用属性占位符,然后将uri配置为mock/stub等用于测试,将真实的uri用于生产
第一个问题:如何注入模拟(或真实?)HttpServletResponse在我对CXF JAX-RS服务endpoint进行单元测试期间? 我们的服务是如何设置的示例(注意我没有控制/权限来更改非测试结构): 测试类: 我可能在这里做错了几件事,但是我希望我只需要在我的自定义调用器中加入正确的“魔法”,以便正确地向我的endpoint注入HttpServlet响应。我要注意的是,在我没有注入上下文
我有以下用例: 问题2:为什么如果我只使用构造函数而不使用@Autowired或者反之亦然,那么一切都能正常工作,因为我没有加载Spring上下文...我有单元测试...
我的实现出了什么问题?谢谢
问题内容: 我正在使用RestTemplate 方法发布到端点。在我的测试文件中,我正在测试POST方法。但是用我目前的测试,我得到了POST请求。在测试文件中发出POST请求时,我需要模拟API的帮助 这是我的主文件 这是我的测试文件 问题答案: 您正在测试DataTestRepo类内部的逻辑,因此您不应模拟它。RestTemplate是DataTestRepo内部的一个依赖项,因此这正是您需要
我是NativeScript的新手,我刚刚制作了我的第一个应用程序。我的应用程序需要在真正的iPhone上进行测试;然而,我不知道如何在真正的iPhone上测试它,而不是在模拟器上。我试着查看appbuilder文档,但我不知道如何在iPhone上测试它。当我插上iPhone时,我试图使用,但我发现: 我不知道为什么我不能在iPhone上运行它。谁能告诉我如何在真正的iPhone上测试它,或者我做
问题内容: 每当我想测试使用资源注入的类时,我最终都会包含一个仅在测试中使用的构造函数: 还有另一种模拟资源注入的方式,或者这是遵循的正确模式吗? 问题答案: 您可以使用简单的光泽效果,它可以模拟EJB注入系统。 另一种方法是在测试中使用反射来设置字段,我有时使用类似这样的内容: