在 Groovy 中创建模拟 JMX 服务器和 Bean

Creating Mock JMX Servers and Beans in Groovy

我们正在监视具有大量自定义 MBean 和属性的自定义应用程序。长期以来,我们一直在实验室中使用服务器进行功能测试,但现在我们想要创建不依赖于实际远程连接的适当单元测试。

就我自己而言,我根本无法弄清楚如何使用 Groovy JMX 构建器来启动本地 MBeanServer,并使用属性和操作列表公开本地 mbean。

有人愿意提供这样一个模型的例子吗?我为 jmxbuilder 找到的现有示例并没有让我到达那里,但看起来应该是可能的。

这是我使用的(Java 中的示例,而不是 Groovy...)

/**
 * Creates a new visible MBeanServer
 * @param name The MBeanServer's default domain name
 * @param xregPlatform true to register all known PlatformManagedObject in the created MBeanServer, false otherwise
 * @return the new MBeanServer
 */
public static synchronized MBeanServer createMBeanServer(final String name, final boolean xregPlatform) {
    MBeanServer mbs = getLocalMBeanServer(name);
    if(mbs==null) {
        mbs = MBeanServerFactory.createMBeanServer(name);
    }
    if(xregPlatform) {
        registerPlatformManagedObjects(mbs);
    }
    return mbs;
}

有关其他方法的详细信息,请参阅我的 JMXHelper

Spock 测试的一个简单示例

  • 将 groovy bean 导出到 JMX
  • 导入并使用这个 bean

代码:

class JMXSpec extends Specification {

    class MyBean {
        def property
    }

    def "launch and test a mbean"() {
        given: "a mbean exported"

            def jmx = new JmxBuilder()
            jmx.export {
                // Export every properties/methods of 'MyBean' 
                // under 'Groovy.Test:name=MyBean'
                bean(
                    target:new MyBean(property:"test"),
                    name:"Groovy.Test:name=MyBean"
                )

            }

        and: "a mbean imported from the local server"
            def mbean = new GroovyMBean(ManagementFactory.getPlatformMBeanServer(), 
                "Groovy.Test:name=MyBean")
        expect:
            "test" == mbean.Property
    }
}

此外,为了后代,这里是一个模仿常见 "queryNames" 方法的略微修改的示例...

import groovy.jmx.builder.JmxBuilder
import spock.lang.Specification
import javax.management.ObjectName
import java.lang.management.ManagementFactory


class SandboxJmxBuilderSpec extends Specification {
    class MyBean {
        def property
    }

    def "launch and test a mbean"() {
        given: "a mbean exported"

        def jmx = new JmxBuilder()
        jmx.export {
            // Export every properties/methods of 'MyBean'
            // under 'Groovy.Test:name=MyBean'
            bean(
                    target:new MyBean(property:"test"),
                    name:"Groovy.Test:name=MyBean"
            )

        }

        and: "a mbean imported from the local server"
        def mbs = ManagementFactory.getPlatformMBeanServer()
        def queryString = "Groovy.Test:name=MyBean"
        def discovery = mbs.queryNames(new ObjectName(queryString), null)

        expect:
        "test" == new GroovyMBean(mbs, discovery[0]).Property
    }
}