代码之家  ›  专栏  ›  技术社区  ›  Igor Artamonov

简单Java AMQP服务器

  •  3
  • Igor Artamonov  · 技术社区  · 15 年前

    有没有用Java编写的简单的AMQP服务器/代理实现?

    我需要使用它进行本地集成测试。我想从ant/maven开始,不需要集群、持久性、性能等特性。只是一个类似rabbitmq的模拟实例,没有安装(就像maven pom的依赖项一样)和配置。

    3 回复  |  直到 6 年前
        1
  •  3
  •   madmuffin    9 年前

    我认为编写集成测试/端到端测试/自动用户接受测试来测试整个应用程序是完全合法的,包括在mqs中完成的所有工作。您应该选择这样的测试用例,因为它会大大减慢测试的反馈循环。

    org.apache.qpid ,可以简单地将其作为mvn/gradle包含在应用程序中 (mvn central) 依赖关系(梯度示例):

    testCompile 'org.apache.qpid:qpid-broker:6.0.1'
    

    然后添加 Rule 包含一个 ExternalResource 这会在测试之前触发代理,有点类似于这个相当简单的设置:

    @Rule
    private static final ExternalResource embeddedAMQPBroker = new ExternalResource() {
        Broker broker;
    
        @Override
        protected void before() throws Throwable {
            BrokerOptions brokerOptions = new BrokerOptions();
            brokerOptions.setConfigProperty("qpid.amqp_port", "55672");
            broker = new Broker();
            broker.startup(brokerOptions);
        }
    
        @Override
        protected void after() {
            broker.shutdown();
        }
    };
    

    未经测试,因为对我来说这不起作用,因为我的所有应用程序都包含jetty 9,qpid(仍然)需要jetty<9。

        2
  •  1
  •   pinepain    10 年前

    你要找的是一个amqp模拟对象。我真的不知道,而且怀疑你会找到现成的。
    如果您使用JUnit作为测试,那么您正在进行单元测试。单元测试不同于集成测试,它不包括对队列的实际读/写。
    也许在这里您可以重新构造测试,甚至是代码,以包含除对队列的读/写之外的所有内容?
    另一个选择是,如果为了可移植性而将amqp包装到其他类中,那么只需模拟该对象。

        3
  •  1
  •   madmuffin    6 年前

    在2016年公布我的答案后,最近我注意到一个新的选择:

    拉比马克的模仿( https://github.com/fridujo/rabbitmq-mock )项目服务于确切的目的,而且重量轻得多。这仍然是一个非常年轻的项目(2018年5月才开始),但我自己能够使用它进行集成测试。

    为了验证mock是否像“真正的东西”一样工作,我首先对rabbitmq实例运行代码,然后切换到mock。